Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 46858 | Accepted: 24819 |
Description
Input
Output
Sample Input
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
Sample Output
15
【题意】 给出一个n*n的方阵,选出一个子矩阵使得里面的值相加最大
【思路】先不管上下,先看左右,找出值最大的j列到k列,然后确定了以后,就好似成了一列,对这列上下求最大子段和
dp[i][j][k]=max(dp[i-1][j][k]+tmp,tmp);tmp=第i行j到k列的值之和
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; const int inf=0x7777777; const int N=107; int a[N][N]; int dp[N][N][N]; int main() { int n; while(~scanf("%d",&n)) { memset(dp,0,sizeof(dp)); for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { scanf("%d",&a[i][j]); } } int ans=-inf; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { int tmp=0; for(int k=j; k<=n; k++) { tmp+=a[i][k]; dp[i][j][k]=max(dp[i-1][j][k]+tmp,tmp); if(dp[i][j][k]>ans) ans=dp[i][j][k]; } } } printf("%d\n",ans); } return 0; }
原文:http://www.cnblogs.com/iwantstrong/p/5820931.html