hdoj 1081 To The Max

参考博客:http://blog.csdn.net/acm_davidcn/article/details/5834454

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

ac代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 int d[110][110];
 4 int main()
 5 {
 6     int n,i,j,max,k,sum,t;
 7     while(~scanf("%d",&n))
 8     {
 9         memset(d,0,sizeof(d));
10 
11         for(i=1; i<=n; i++)
12         for(j=1; j<=n; j++)
13         {
14             scanf("%d",&d[i][j]);
15             d[i][j]+=d[i-1][j];
16         }
17         max=d[1][1];
18 
19         for(i=1; i<=n; i++)
20         for(j=i; j<=n; j++)
21         {
22             sum=0;
23             for(k=1; k<=n; k++)
24             {
25                 t=d[j][k]-d[i-1][k];
26                 sum+=t;
27 
28                 if(sum>=max)
29                 max=sum;
30 
31                if(sum<0)
32                sum=0;
33             }
34         }
35 
36         printf("%d\n",max);
37     }
38 }

 

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

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 const int INF=-1<<29;
 5 int main()
 6 {
 7     int n,i,j,k,l,d[110][110],a[110],max1,max2,dp[110];
 8     while(~scanf("%d",&n))
 9     {
10         max2=INF;
11         for(i=0; i<n; i++)
12             for(j=0; j<n; j++)
13                 scanf("%d",&d[i][j]);
14 
15         for(i=0; i<n; i++)
16             for(j=i; j<n; j++)
17             {
18                 memset(a,0,sizeof(a));
19                 memset(dp,0,sizeof(dp));
20                 for(k=0; k<n; k++)
21                 {
22                     for(l=i; l<=j; l++)
23                     {
24                         a[k]+=d[l][k];
25                     }
26                     if(k==0)
27                         {dp[0]=a[0]; max1=dp[0];}
28                     else
29                     {
30                         if(dp[k-1]>0)  dp[k]=a[k]+dp[k-1];
31                         else dp[k]=a[k];
32                     }
33                     if(dp[k]>max1)
34                     max1=dp[k];
35                 }
36                 if(max1>max2)
37                 max2=max1;
38             }
39             printf("%d\n",max2);
40     }
41 }

 

 

posted @ 2013-06-07 20:29  水门  阅读(158)  评论(0编辑  收藏  举报