码迷,mamicode.com
首页 > 其他好文 > 详细

Bzoj-1084 最大子矩阵

时间:2017-12-02 11:25:49      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:pre   lap   clu   display   space   eve   alt   out   矩阵   

这题的思路好妙啊,一开始看到这题不会写(没瞄到m的范围

然后定睛一看$m<=2$!而且$n<=100$,一般按照这种题的尿性不是n3就是n3加个log...

可是我还是不会写啊qwq...三维...$f[i][j][k]$!都代表啥啊Qwq...到$(1,1)到$(i,j)$的矩阵中取k个的最大值?我不会啊qwq...

然后被大爷教了一波--这题水啊qwq...

首先分两类吧

m=1的情况,$f[i][K]$表示第1列i行取k个矩阵的最大值

$f[i][K]=max(f[I][K-1]+sum[i]-sum[I];$

$f[i][K])/f[i][K]=f[i-1][K];$

m=2的情况,$f[i][j][K]$表示第1列第i行和第2列第j行取k个矩阵的最大值

$F[i][j][K]=max(F[i-1][j][K],F[i][j-1][K]);$

$F[i][j][K]=max(F[I][j][K-1]+sum[i][0]-sum[I][0],F[i][j][K]);$

$F[i][j][K]=max(F[i][J][K-1]+sum[j][1]-sum[J][1],F[i][j][K]);$

$F[i][j][K]=max(F[i][j][K],F[I][I][K-1]+sum[j][1]-sum[I][1]+sum[i][0]-sum[I][0]);$

技术分享图片
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 #define ll long long
 7 #define inf 0x7fffffff
 8 #define maxn 105
 9 #define maxk 15
10 int f[maxn][maxk],F[maxn][maxn][maxk];
11 int n,m,k;
12 
13 int main()
14 {
15     cin>>n>>m>>k;
16     if(m==1)
17     {
18         int sum[maxn]={0};
19         for(int i=1;i<=n;i++)
20         {
21             int x;cin>>x;sum[i]=sum[i-1]+x;
22         }
23         for(int i=1;i<=n;i++)
24             for(int K=1;K<=k;K++) f[i][K]=-inf;
25         for(int i=1;i<=n;i++)
26             for(int K=1;K<=k;K++)
27             {
28                 f[i][K]=f[i-1][K];
29                 for(int I=0;I<i;I++)
30                     f[i][K]=max(f[I][K-1]+sum[i]-sum[I],f[i][K]);
31             }
32         cout<<f[n][k]<<"\n";
33     }
34     else
35     {
36         int sum[maxn][2]={0};
37         for(int i=1;i<=n;i++)
38             for(int j=0;j<m;j++)
39             {
40                 int x;cin>>x;sum[i][j]=sum[i-1][j]+x;
41             }
42         for(int i=1;i<=n;i++)
43             for(int j=1;j<=n;j++)
44                 for(int K=1;K<=k;K++) F[i][j][K]=-inf;
45         for(int i=1;i<=n;i++)
46             for(int j=1;j<=n;j++)
47                 for(int K=1;K<=k;K++)
48                 {
49                     F[i][j][K]=max(F[i-1][j][K],F[i][j-1][K]);
50                     for(int I=0;I<i;I++)F[i][j][K]=max(F[I][j][K-1]+sum[i][0]-sum[I][0],F[i][j][K]);
51                     for(int J=0;J<j;J++)F[i][j][K]=max(F[i][J][K-1]+sum[j][1]-sum[J][1],F[i][j][K]);
52                     if(i==j)
53                         for(int I=0;I<i;I++)
54                             F[i][j][K]=max(F[i][j][K],F[I][I][K-1]+sum[j][1]-sum[I][1]+sum[i][0]-sum[I][0]);
55                 }
56         cout<<F[n][n][k]<<"\n";
57     }
58     return 0;
59 }
[SCOI2005]最大子矩阵

 

Bzoj-1084 最大子矩阵

标签:pre   lap   clu   display   space   eve   alt   out   矩阵   

原文地址:http://www.cnblogs.com/ZincSabian/p/7944940.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!