336K |
16MS |
GCC |
627B |
2009-01-12 20:44:31 |
一维的很简单,
就判断一个大于小于0的情况。(两个分支)。(求解过程中可不用建立数组c)
对于二维的
通过一个循环
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
遍历所有情况的起始行和结束行,然后将多行合并为一行(即将一列的元素加起来)
如当i=1,j=2时,就是将1,2行捆绑。即a[1][k]+a[2][k]=b[k],题目就转化为求数组b上的最大子段和。
代码如下:
Code
#include<stdio.h>
#include<string.h>
int a[105][105],b[105],c[105],n;
void input()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
}
int dp()
{
int max,sum,i;
max=sum=b[1];
for(i=2;i<=n;i++){
if(sum>0) sum=sum+b[i];
else
sum=b[i];
if(max<sum)
max=sum;
}
return max;
}
void process()
{
int i,j,max=-999999,k;
for(i=1;i<=n;i++){
memset(b,0,sizeof(b));
for(j=i;j<=n;j++){
for(k=1;k<=n;k++)
b[k]+=a[j][k];
if(dp()>max)
max=dp();
}
}
printf("%d\n",max);
}
int main()
{
input();
process();
return 0;
}