hdu 1081 To The Max(最大子段和的升级版,二维)

http://acm.hdu.edu.cn/showproblem.php?pid=1081

一维最大字段和:dp [ i ] = max ( dp[ i-1 ]  , 0 ) + a [ i ] ;

如果是二维的话,可以变成一维的用map [ i ] [ j ] 表示第 i 行前 j 个元素的和,dp [ k ] [ i ] (l 表示j) 表示到第 k 行 第 i 列的最大值

则dp [ k ] [ i ] = max ( map [ k ] [ i ] - map [ k ] [  j -1 ] , 0 )  , ( j <= i ) .

 

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

 

posted @ 2013-05-06 09:42  zlyblog  阅读(155)  评论(0编辑  收藏  举报