bzoj1084 SCOI2005 最大子矩陣

2021-07-22 05:03:21 字數 1163 閱讀 7749

description

這裡有乙個n*m的矩陣,請你選出其中k個子矩陣,使得這個k個子矩陣分值之和最大。注意:選出的k個子矩陣

不能相互重疊。

input

第一行為n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下來n行描述矩陣每行中的每個元素的分值(每個元素的

分值的絕對值不超過32767)。

output

只有一行為k個子矩陣分值之和最大為多少。

sample input

3 2 2

1 -3

2 3-2 3

sample output

本來想著m有很大很大,但是沒想到最大只有二。

那就是只有兩種情況。m=1或m=2。

那就沒怎麼難了。

狀態:f[i][j][k]表示第一列到了第i個格仔,第二列到了第j個格仔,已經選取了k個矩陣的最大得數。

轉移:先把現有的狀態向後轉移,轉移成f[i』][j』][k],然後取矩陣,向後轉移,轉移成f[i』][j』][k + 1]。這裡要分三種情況討論,轉移第一列,轉移第二列,和兩列一起轉移。

#include

#include

#include

using

namespace

std;

int a[110][110],s[110][110];

int f1[110][110],f2[110][110][110];

int main()

}int ans=0;

if(n==1)}}

for(int i=0;i<=n;i++)

}printf("%d\n",ans);return

0; }

else

for(int kk=j+1;kk<=n;kk++)

for(int kk=max(i,j)+1;kk<=n;kk++)}}

}for(int i=0;i<=n;i++)}}

printf("%d\n",ans);return

0; }

return

0;}

BZOJ1084 SCOI2005 最大子矩陣

portal 注意到m只能為1或2 分類討論。m 1的時候其實就是最大k段連續子段和。f i j ma x f i j ma x f k j f k j 1 sum i s um k m 2時 g i j k 表示第一列到i,第二列到j,選了k個子矩陣的最大和 那麼有一下幾種情況 都不選 g i j...

BZOJ1084 SCOI2005 最大子矩陣

這題顯然是dp。定義f i j k 表示前i行j列裡有k個矩陣的最大元素總和。因為m 2,所以可以分兩種情況分別寫乙個dp,套一套容斥就行了。如下 include include include using namespace std const int maxn 105,maxk 15 int n...

BZOJ1084 SCOI2005 最大子矩陣

bzoj1084 scoi2005 最大子矩陣 這裡有乙個n m的矩陣,請你選出其中k個子矩陣,使得這個k個子矩陣分值之和最大。注意 選出的k個子矩陣不能相互重疊。第一行為n,m,k 1 n 100,1 m 2,1 k 10 接下來n行描述矩陣每行中的每個元素的分值 每個元素的分值的絕對值不超過32...