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