洛谷 P2331 SCOI2005 最大子矩陣

2021-07-24 13:58:41 字數 966 閱讀 9518

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

輸入格式:

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

輸出格式:

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

輸入樣例#1:

3 2 21 -32 3-2 3

輸出樣例#1:9

套路,又是一眼看上去不會做。

但是這個資料範圍很奇怪,m<=2。

所以想另外乙個問題,有一列數,選不重疊的k段,使之和最大,簡單的動規。

由上乙個問題,設f[i][j]表示第一列選了i個數,第二列選了j個數分成k個矩形的最大分值。

所以有三種轉移,在第一列選,在第二列選,和選乙個寬度為二的矩形。

注意:

f[i][j][g]=max(f[i][j-1][g],f[i-1][j][g]);
f的狀態一定要邊算變更新。一開始沒加,只得了10分。

#include#include#includeusing namespace std;

int n,m,k,s[105][5],f[105][105][15];//第一列前i個第二列前j個中選k個子矩陣的最大分值

int main()

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

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

for(int g=1;g<=k;g++)

printf("%d\n",f[n][n][k]);

return 0;

}

洛谷P2331 SCOI2005 最大子矩陣

題目 dp此題可以分為兩個子問題。m 等於 1 原題目轉化為求一行數列裡的 k 塊區間的和,區間可以為空的值。直接定義狀態 dp i t 表示前i個數分為t塊的最大值。因為區間可以為空,所以最大值再小也不會比0小,所以初始化 dp 值為 0 有方程 dp i t max dp i 1 t dp j ...

洛谷P2331 SCOI2005 最大子矩陣

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

P2331 SCOI2005 最大子矩陣

這裡有乙個n m的矩陣,請你選出其中k個子矩陣,使得這個k個子矩陣分值之和最大。注意 選出的k個子矩陣不能相互重疊。其中 1 le n le 100,1 le m le 2,1 le k le 10.m 只有 1 和 2 兩種取值,所以直接討論就好 m 1 時 是前 k 個最大連續欄位和 定義 f ...