一维的最大字段和
int dp(int n) { int i, j, sum = 0, max = -10000; for(i = 1; i <= n; i++) { if(sum < 0) sum = 0; sum += a[i]; if(sum > max) max = sum; } return sum; }
求第k行 第 i-j列的最大子断和,注意为什么要从1开始取,以及dp的初始化,
当前k-1行的sum<0时,如果加到当前的sum上,肯定是会使当前的sum变得更小
for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { for(int k=1,sum=0;k<=n;k++) { sum=sum>0?sum:0; sum=sum+dp[k][j]-dp[k][i-1]; if(m<sum)m=sum; } } }
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int main() { //freopen("in.txt","r",stdin); int dp[102][102],a,n; while( scanf("%d",&n)!=EOF) { int m=-0xfffffff; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&a); dp[i][j]=dp[i][j-1]+a; } } for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { for(int k=1,sum=0;k<=n;k++) { sum=sum>0?sum:0; sum=sum+dp[k][j]-dp[k][i-1]; if(m<sum)m=sum; } } } printf("%d\n",m); } return 0; }