[Luogu] P2331 [SCOI2005]最大子矩阵

\(Link\)

Description

有一个\(n*m\)的矩阵,请你选出其中\(k\)个子矩阵(可以选空矩阵),使得这个\(k\)个子矩阵分值之和最大。注意:选出的\(k\)个子矩阵不能相互重叠。(\(1\le{n}\le{100},1\le{m}\le{2},1\le{k}\le{10}\)

Solution

看到数据范围这么小,就知道要\(dp\)乱搞

\(m=1\)时,就是P2389 电脑班的裁员

\(m=2\)时,我们设\(dp[i][j][t]\)表示第\(1\)列枚举到\(i\),第\(2\)列枚举到\(j\),总共选了\(t\)个子矩阵的最大分值。

那么现在就很好转移了:

如果现在什么都不选,那么就是\(dp[i][j][t]=max(dp[i-1][j][t],dp[i][j-1][t]);\)

否则考虑只选一列的,枚举\(p\le{i}\)\(dp[i][j][t]=max\{dp[p-1][j][t-1]+s1[i]-s1[p-1]\}\)\(j\)的同理。

若同时选两列的,要求\(i=j\),那么\(dp[i][i][t]=max(dp[p-1][p-1][t-1]+s1[i]-s1[p-1]+s2[i]-s2[p-1])\)

要注意先枚举\(t\),再枚举\(i,j\),因为\(k\)是从小到大转移的,而\(i,j\)是按区间顺序转移的,所以只有求解了\(k-1\)才能求\(k\)

posted @ 2020-10-28 08:46  andysj  阅读(43)  评论(0编辑  收藏  举报