动态规划入门——To The Max

转载请注明出处:http://blog.csdn.net/a1dark

分析:这是一道求最大子矩阵和的题、是最大子段和的扩展、只要将I-J列捆绑成一列、便可以用最大子段和来做、

#include<stdio.h>
#include<string.h>
#define N 101
int mpt[N][N];
int sum[N];
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                scanf("%d",&mpt[i][j]);
                mpt[i][j]+=mpt[i-1][j];
            }
        }
        int max=mpt[1][1];
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++){
                memset(sum,0,sizeof(sum));
                for(int k=1;k<=n;k++){
                    if(sum[k-1]>=0)
                        sum[k]=sum[k-1]+(mpt[j][k]-mpt[i][k]);
                    else
                        sum[k]=(mpt[j][k]-mpt[i][k]);
                    if(max<sum[k])
                        max=sum[k];
                }
            }
        }
        printf("%d\n",max);
    }
    return 0;
}


你可能感兴趣的:(ACM,动态规划入门)