【动态规划】HDU1081To The Max

来源:互联网 发布:知乎不能修改不了答案 编辑:程序博客网 时间:2024/06/05 07:26

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081

/*    将维度合成一列*/#include<bits/stdc++.h>using namespace std;const int N=1050;int dp[N][N];   //  dp[i][j]表示从dp[1][j]~dp[i][j]的和int a[N][N];int t[N];int ss,ee;int MaxSum(int *a,int n){    int s;    int Max=0,sum=0;    for(int i=1;i<=n;i++){        if(sum>0){            sum+=a[i];        }else{            s=i;            sum=a[i];        }        if(sum>Max){            Max=sum;            ss=s;            ee=i;        }    }    return Max;}int main(){    int n;    while(cin>>n){        memset(dp,0,sizeof(dp));        memset(t,0,sizeof(t));        for(int i=1;i<=n;i++){            for(int j=1;j<=n;j++){                cin>>a[i][j];                dp[i][j]=dp[i-1][j]+a[i][j];            }        }        int Max=0;        int x,y,S,T;    //  开始行,宽度,开始结束位置        for(int i=1;i<=n;i++){              //  枚举行的起点            for(int j=1;j<=n-i+1;j++){      //  枚举宽度                for(int k=1;k<=n;k++){      //  枚举列,将二维整合成一维                    t[k]=(dp[i+j-1][k]-dp[i-1][k]);                }                int tmp=MaxSum(t,n);                if(tmp>Max){                    Max=tmp;                    x=i;                    y=j;                    S=ss;                    T=ee;                }            }        }        cout<<Max<<endl;    //    for(int i=x;i<=x+y-1;i++){    //        for(int j=S;j<=T;j++){    //            cout<<a[i][j]<<' ';    //        }    //        cout<<endl;    //    }    }    return 0;}


原创粉丝点击