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上的最大子段和。

代码如下:

 


#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;
}

相关文章: