您的位置:首页 > 其它

DP训练 POJ-1050 To the Max

2014-03-22 23:01 267 查看
题意:给出一个矩阵,求出最大子矩阵。最大子矩阵就是该矩阵的所有元素之和最大。

思路:把该问题转化为一维数组最大连续子串和问题,即二维转化为一维。假设求出的最大子矩阵为从x行到y行,从第c列到第r列,则该矩阵转化为一维即用数组储存从第1列到第n列的所有x行到第y行的元素和,求数组的最大连续子串和。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#define maxn 111
using namespace std;
int n;
int max(int a,int b){
return a>b?a:b;
}
int maxvalue(int vv[maxn]){//求一维最大连续子段和
int dp[maxn];
memset(dp,0,sizeof(dp));
dp[0] = vv[0];
for(int i = 1;i < n;++i){
dp[i] = max(vv[i],dp[i-1]+vv[i]);
}
int mmax = 0;
for(int i = 0;i < n;++i)
if(dp[i] > mmax)
mmax = dp[i];
return mmax;
}
int main(){
while(scanf("%d",&n) != EOF){
int num[maxn][maxn];
int dit[maxn];
memset(dit,0,sizeof(dit));
for(int i = 0;i < n;++i)
for(int j = 0;j < n;++j)
scanf("%d",&num[i][j]);
int ans = 0;
for(int i = 0;i < n;++i){
memset(dit,0,sizeof(dit));
for(int j = i;j < n;++j){
for(int k = 0;k <n;++k){
dit[k] += num[j][k];//记录第k列前j个元素之和存入数组里
}
ans = max(ans,maxvalue(dit));//转化为求一维数组最大连续子段和
}
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: