poj 1050 To the Max

来源:互联网 发布:网络速度测试工具 编辑:程序博客网 时间:2024/05/21 09:22

题目大意:有一个n*n的二维矩阵,求出最大子矩阵的和。

思路:

(1)对于一维数列a1,a2,a3,a4,......,an,以第i个数结尾的字段和dp[i] = num[i] + max(dp[i-1], 0)

(2)对于二维矩阵,枚举不同的列,然后视为一维数列求最大字段和的问题。

 

#include <iostream>#include <cstdio>#include <climits>using namespace std;int map[105][105],dp[105];int main(){    int n,i,j,k,tmp,ans;    while (scanf("%d",&n)==1)    {        for (i=1;i<=n;i++)            for (j=1;j<=n;j++)            {                scanf("%d",&tmp);                map[i][j]=map[i][j-1]+tmp;            }        ans=INT_MIN;        for (i=1;i<=n;i++)            for (j=i;j<=n;j++)                for (k=1;k<=n;k++)                {                    dp[k]=map[k][j]-map[k][i-1]+max(0,dp[k-1]);                    ans=max(ans,dp[k]);                }        printf("%d\n",ans);    }    return 0;}


 

 

原创粉丝点击