openjudge-NOI 2.6-1768 最大子矩阵
题目链接:http://noi.openjudge.cn/ch0206/1768/
题解:
如果用O(n4)的算法肯定会炸,需要压缩掉一维的空间,只需要简单加和就好啦
例如,我们要对样例中第2-4行DP,就这样压缩:
然后利用区间DP中求最大子序列和的状态转移方程fi=max(fi-1+ai,ai)求解即可
代码为了节约空间少记录了一些东西,temp1为当前正在求的这几行的最大结果,temp2为当前的ai
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define MAXN 110 6 #define MAX 2147483647 7 int n,f[MAXN],a[MAXN][MAXN]; 8 int main() 9 { 10 int ans=-MAX; 11 scanf("%d",&n); 12 for(int i=1;i<=n;i++) 13 for(int j=1;j<=n;j++) 14 { 15 scanf("%d",&a[i][j]); 16 a[i][j]+=a[i-1][j]; 17 } 18 for(int i=1;i<=n;i++) 19 { 20 for(int j=i;j<=n;j++) 21 { 22 memset(f,0,sizeof(f)); 23 int temp1=-MAX; 24 for(int k=1;k<=n;k++) 25 { 26 int temp2=a[j][k]-a[i-1][k]; 27 f[k]=max(f[k-1]+temp2,temp2); 28 temp1=max(temp1,f[k]); 29 } 30 ans=max(ans,temp1); 31 } 32 } 33 printf("%d\n",ans); 34 return 0; 35 }