hdu1081


一维的最大字段和

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


你可能感兴趣的:(hdu1081)