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 }

 

posted @ 2016-10-20 16:05  xqmmcqs  阅读(986)  评论(0编辑  收藏  举报