您的位置:首页 > 其它

hdoj 1081 To The Max

2013-06-07 20:29 351 查看
参考博客:/article/2918426.html

d[i][j]表示到第i行的所有的同一列的和,3个for循环,时间复杂度O(n^3),表示从第i行到第j行 求从第1列到第n列 连续的最大值。

ac代码:

#include<stdio.h>
#include<string.h>
int d[110][110];
int main()
{
int n,i,j,max,k,sum,t;
while(~scanf("%d",&n))
{
memset(d,0,sizeof(d));

for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
scanf("%d",&d[i][j]);
d[i][j]+=d[i-1][j];
}
max=d[1][1];

for(i=1; i<=n; i++)
for(j=i; j<=n; j++)
{
sum=0;
for(k=1; k<=n; k++)
{
t=d[j][k]-d[i-1][k];
sum+=t;

if(sum>=max)
max=sum;

if(sum<0)
sum=0;
}
}

printf("%d\n",max);
}
}


再贴上我之前自己写的O(n^4)的代码(不知道为么,杭电上对了,sdut上没对)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int INF=-1<<29;
int main()
{
int n,i,j,k,l,d[110][110],a[110],max1,max2,dp[110];
while(~scanf("%d",&n))
{
max2=INF;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
scanf("%d",&d[i][j]);

for(i=0; i<n; i++)
for(j=i; j<n; j++)
{
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
for(k=0; k<n; k++)
{
for(l=i; l<=j; l++)
{
a[k]+=d[l][k];
}
if(k==0)
{dp[0]=a[0]; max1=dp[0];}
else
{
if(dp[k-1]>0)  dp[k]=a[k]+dp[k-1];
else dp[k]=a[k];
}
if(dp[k]>max1)
max1=dp[k];
}
if(max1>max2)
max2=max1;
}
printf("%d\n",max2);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: