SCOI 2005 最大子矩陣

2022-05-05 02:39:07 字數 1144 閱讀 7744

【題目鏈結】

點選開啟鏈結

【演算法】

動態規劃

我們發現,m只有兩種取值,1和2,那麼,只需分類討論即可

當m = 1時,其實這個問題就成了就最大連續子段和的問題,只不過要選k段而已

用f[i][j]表示選到第i行,選了j段,那麼,顯然有 : f[i][j] = max(sum為字首和)

當m = 2時,我們用f[i][j][k]表示第一列選到第i行,第二列選到第j行,選了k段

那麼 :

如果不取,f[i][j][k] = max

如果第一列取,f[i][j][k] = max

如果第二列取,   f[i][j][k] = max

如果第一二列都取,我們可以把它看成兩種情況

第一種,看成乙個大矩形,f[i][j][k] = max

第二種,看成兩個小矩形,f[i][j][k] = max (k > 1)

此題就是需要我們認真讀題,如果發現了"1<=m<=2",那麼,問題就變得簡單多了!

【**】

#includeusing

namespace

std;

#define maxn 110

#define maxk 12

const

int inf =2e9;

intn,m,k;

inline

void

solve1()

}memset(sum,

0,sizeof

(sum));

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

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

printf(

"%d\n

",f[n][k]);

}inline

void

solve2()}}

memset(sum,

0,sizeof

(sum));

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

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

}}

printf(

"%d\n

",f[n][n][k]);

}int

main()

SCOI2005 最大子矩陣

dp!dp!dp!乙個dp蒟蒻的部落格裡寫滿了dp題,真不知道我之前是怎麼想的 任意門description 這裡有乙個n m的矩陣,請你選出其中k個子矩陣,使得這個k個子矩陣分值之和最大。注意 選出的k個子矩陣不能相互重疊。input 第一行為n,m,k 1 n 100,1 m 2,1 k 10 ...

SCOI2005 最大子矩陣

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

SCOI2005 最大子矩陣

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