DP训练 POJ-1050 To the Max
2014-03-22 23:01
267 查看
题意:给出一个矩阵,求出最大子矩阵。最大子矩阵就是该矩阵的所有元素之和最大。
思路:把该问题转化为一维数组最大连续子串和问题,即二维转化为一维。假设求出的最大子矩阵为从x行到y行,从第c列到第r列,则该矩阵转化为一维即用数组储存从第1列到第n列的所有x行到第y行的元素和,求数组的最大连续子串和。
思路:把该问题转化为一维数组最大连续子串和问题,即二维转化为一维。假设求出的最大子矩阵为从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; }
相关文章推荐
- POJ 1050 To the Max 枚举+dp
- POJ 1050 To the Max(最长子串DP)
- poj 1050 To the Max (dp)
- POJ 1050/ ZOJ 1074:To the Max - DP求子矩阵和
- POJ 1050 To the Max DP
- poj 1050 To the Max dp 最大子矩阵
- poj to the max(最大子矩阵和) 1050(dp大法)
- POJ 1050 To the Max 最大子矩阵和 简单dp
- Poj 1050 To the Max (最大子矩阵 DP)
- poj 1050 To the Max (简单dp)
- DP::Poj1050 To the max
- POJ 1050 to the max(dp)
- POJ 1050 To the Max【DP】
- poj - 1050 - To the Max(dp)
- poj - 1050 - To the Max(dp)
- POJ 1050 To the Max DP
- zoj 1074 || poj 1050 To the Max(简单DP)
- HDOJ 1081 POJ 1050 ZOJ 1074 TO THE MAX【dp】
- poj 1050 To the Max 最大子矩阵和 经典dp
- POJ 1050 To the Max(DP)