這裡有乙個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 ...