您的位置:首页 > 其它

nyoj104_最大和dp

2016-12-22 17:26 344 查看
原题链接》》》

思路就是转化为一维求最大和

nyoj44就是一维最大和的处理

一维最大和处理》》》

#include<stdio.h>
#include<string.h>
int num[101][101];
int ans[101];
int oneD_Max(int a[],int n){
int sum=0;
int max=-10000;
for(int i=0;i<n;i++){
if(sum>0) sum+=a[i];
else sum=a[i];
if(sum>max) max=sum;
}
return max;
}
int main(){
int N,n,m,i,j,k,max,temp;
scanf("%d",&N);
while(N--){
max=-10000;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&num[i][j]);
for(k=0;k<n;k++){
memset(ans,0,sizeof(ans));
for(i=k;i<n;i++){
for(j=0;j<m;j++)
ans[j]+=num[i][j];
temp=oneD_Max(ans,j);
if(temp>max) max=temp;
}
}
printf("%d\n",max);
}
return 0;
}


本来想优化一下,结果时间还变长了(让ans[j]不用每次累加)

#include<stdio.h>
#include<string.h>
int num[101][101];
int ans[101];
int oneD_Max(int a[],int n){
int sum=0;
int max=-10000;
for(int i=0;i<n;i++){
if(sum>0) sum+=a[i];
else sum=a[i];
if(sum>max) max=sum;
}
return max;
}
int main(){
int N,n,m,i,j,k,max,temp;
scanf("%d",&N);
while(N--){
max=-10000;
memset(ans,0,sizeof(ans));
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&num[i][j]);
for(i=1;i<n;i++)
for(j=0;j<m;j++)
num[i][j]+=num[i-1][j];
for(k=0;k<n;k++){
for(i=k;i<n;i++){
if(k==0){
temp=oneD_Max(num[i],m);
}
else{
for(j=0;j<m;j++)
ans[j]=num[i][j]-num[k-1][j];
temp=oneD_Max(ans,m);
}
if(temp>max) max=temp;
}
}
printf("%d\n",max);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息