Hdu 1081 To The Max -- DP

来源:互联网 发布:中山陵哭陵事件 知乎 编辑:程序博客网 时间:2024/06/06 17:51
/*题意:给你一个n*n的矩阵,充满数字。让你找到一个矩形区域,使得区域内数字和最大。分析:将矩阵看做一列数字去求,求这一列数字中最大的片段和。但是怎么把矩阵压缩成一列呢?而且要保证其正确性?  从1-n行,每次从第i行往下加,得到n-i+1种情况。一共n*(n-1)/2种情况。完备和准确性都满足。*/#include<stdio.h>#include<string.h>int a[105][105];int b[105];#define Min -99999999int main(){int n,ans;while(~scanf("%d",&n)){ans = Min;memset(a,0,sizeof(a));for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)scanf("%d",&a[i][j]);for (int i = 1; i <= n; i++)//以第i行为第一行开始往下加,每回得到n-i+1列数字。总共需要求n*(n-1)/2次。{memset(b,0,sizeof(b));for (int j = i; j <= n; j++){for (int k = 1; k <= n; k++){b[k] += a[j][k];}//O(n)的方法求最大片段和。int tem1 = b[1];int tem2 = tem1;for (int i = 2; i <= n; i++){if(tem1>0)tem1 += b[i];else tem1 = b[i];if(tem2 < tem1) tem2 = tem1;}if(tem2 > ans)ans = tem2; }}printf("%d\n",ans);}return 0;}

原创粉丝点击