hdu1081 To The Max 【动态规划】【最大子矩阵】
2017-10-13 21:45
239 查看
题目大意:
给一个矩阵,求其最大子矩阵和。其实只需要n2枚举子矩阵高度i行至j行,再将每一列这部分求和,再求一维最大连续子序列就行了。
至于最大连续子序列,可以找我代码中那样做,时间复杂度O(n)。
注意:多组数据又不说,巨坑!
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<queue> #include<vector> #define ll long long using namespace std; int getint() { int i=0,f=1;char c; for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=='-')c=getchar(),f=-1; for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0'; return i*f; } const int N=105,INF=0x7fffffff; int n,ans,a ,sum ; int getmx() { int res=-INF,tmp=0; for(int i=1;i<=n;i++) { tmp=tmp>0?tmp+sum[i]:sum[i]; res=max(res,tmp); } return res; } int main() { //freopen("lx.in","r",stdin); //freopen("lx.out","w",stdout); while(scanf("%d",&n)!=EOF) { ans=-INF; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=getint(); for(int i=1;i<=n;i++) { memset(sum,0,sizeof(sum)); for(int j=i;j<=n;j++) { for(int k=1;k<=n;k++)sum[k]+=a[j][k]; ans=max(ans,getmx()); } } cout<<ans<<'\n'; } return 0; }
相关文章推荐
- HDU1081:To The Max(最大子矩阵,线性DP)
- hdu1081 To The Max(动态规划-最大子矩阵)
- hdu1081 To The Max(动态规划-最大子矩阵)
- 动态规划(DP)——HDU1081、PKU1050 To The Max 最大子矩阵问题
- hdu 1081 To The Max最大矩阵和(动态规划)
- POJ 1050 To the Max(动态规划、最大子矩阵和)
- hdu1081 To The Max_最大子矩阵求和问题
- 【 HDU1081 】 To The Max (最大子矩阵和)
- poj 1050 To the Max(最大子矩阵之和,基础DP题)
- hdu 1081 To The Max(子矩阵最大和)
- 经典动态规划——HDU1081 To The Max 最大子矩阵问题
- POJ 1050 To the Max (动态规划——求最大子矩阵和)
- ACM Poj1050 To the Max 求矩阵中局部矩形区域和最大值 java版本
- HDU 1081 To The Max【DP】【最大子段矩阵求和】
- TOJ 2010 ZOJ 1074 HDU1081 To The Max /最大子矩阵和
- POJ 1050 To the Max【最大子矩阵】
- poj 1050 To the Max 求矩阵中局部矩形区域和最大值
- hdu1081 To The Max(最大子矩阵和)
- 1081 To The Max【最大子矩阵】
- pku1050----To the Max(求矩阵的最大子段和)