最大子矩陣 DP

2021-07-08 18:09:34 字數 1397 閱讀 7819

time limit:10000ms memory limit:165888kb 64bit io format:%lld & %llu

hysbz 1084

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

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

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

sample input

3 2 2

1 -3

2 3

-2 3

sample output

9雖然一看就是dp,可是一開始完全不知道如何dp,後來看到了資料範圍…笑了,當m=1的時候就是普通的最大連續子串和,麻煩的是當m=2的時候的狀態轉移很麻煩,我們設f[i][j][k]為第一列選前i個,第二列選前j個,選了k個時候的最大權值

那麼有

f[i][j][k] = max(f[i-1][j][k],f[i][j-1][l]);

f[i][j][k] = max(f[ii][j][k-1]+sum[ii+1][i][0]) 重新調整第一列

f[i][j][k]=max(f[i][jj][k-1]+sum[jj+1][j][1]) 重新調整第二列

當i==j時就是形成乙個矩陣,再處理就是了

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

int cas=1,t;

const

int maxn = 100;

const

int maxm =20;

using

namespace

std;

int n,m,k;

int a[maxn][maxn],sum[maxn][maxn],f[maxn][maxm],ff[maxn][maxn][maxm];

int main()}}

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

}else

}

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

}return

0;}

最大子矩陣 dp

已知矩陣的大小定義為矩陣中所有元素的和。給定乙個矩陣,你的任務是找到最大的非空 大小至少是1 1 子矩陣。比如,如下4 4的矩陣 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 的最大子矩陣是 9 2 4 1 1 8 這個子矩陣的大小是15。輸入是乙個n n的矩陣。輸入的第一行給出n...

最大子矩陣問題 dp

e acmer 題意 給你乙個矩陣,求它的所有元素和最大的子矩陣.分析 我們只知道一維的情況就是經典的最大子段和.然而維數達到二維就變的複雜了.我們觀察資料範圍500,易想到n3 的演算法也能過.純暴力是n4 的方法 然後可以通過列舉其中一維,dp最後一維的方法求出.處理列上的和為字首和,然後列舉列...

dp專題 最大子矩陣

題目大意 求乙個最大為100 100矩陣中的子矩陣中元素之和的最大值。列舉此子矩陣是第i行到第j行。然後壓成一維dp最大子段和。include include include include include include include include include include includ...