Bzoj-1084 最大子矩陣
阿新 • • 發佈:2017-12-02
lap std urn sed color bcb ffffff ace 我不
這題的思路好妙啊,一開始看到這題不會寫(沒瞄到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[SCOI2005]最大子矩陣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 }
Bzoj-1084 最大子矩陣