portal
注意到m只能為1或2
分類討論。
m=1的時候其實就是最大k段連續子段和。 f[
i][j
]=ma
x(f[
i][j
],ma
x(f[
k][j
],f[
k][j
−1]+
sum[
i]−s
um[k
]));
m=2時
g[i][j][k]表示第一列到i,第二列到j,選了k個子矩陣的最大和;
那麼有一下幾種情況:
①都不選:g[
i][j
][k]
=max
(g[i
−1][
j][k
],g[
i][j
−1][
k]);
②第一列中選: g[
i][j
][k]
=max
(g[i
][j]
[k],
g[ii
][j]
[k−1
]+su
m[i]
−sum
[ii]
);③第二列中選: g[
i][j
][k]
=max
(g[i
][j]
[k],
g[i]
[jj]
[k−1
]+ss
[j]−
ss[j
j]);
④若i==j,則兩列中同時選: g[
i][j
][k]
=max
(g[i
][j]
[k],
g[ii
][ii
][k−
1]+s
um[i
]−su
m[ii
]+ss
[i]−
ss[i
i]);
#include
#include
#include
#include
#include
#define n 2005
#define inf 1000000001
using
namespace
std;
typedef
long
long ll;
int read()
while(isdigit(ch))
return x*f;
}int n,m,k;
int sum[105],ss[105];
int f[105][11],g[105][105][11];
void input_init()
void dp()
printf("%d\n",f[n][k]);
}void dp()
printf("%d\n",g[n][n][k]);
}int main()
bzoj1084 SCOI2005 最大子矩陣
description 這裡有乙個n m的矩陣,請你選出其中k個子矩陣,使得這個k個子矩陣分值之和最大。注意 選出的k個子矩陣 不能相互重疊。input 第一行為n,m,k 1 n 100,1 m 2,1 k 10 接下來n行描述矩陣每行中的每個元素的分值 每個元素的 分值的絕對值不超過32767 ...
BZOJ1084 SCOI2005 最大子矩陣
這題顯然是dp。定義f i j k 表示前i行j列裡有k個矩陣的最大元素總和。因為m 2,所以可以分兩種情況分別寫乙個dp,套一套容斥就行了。如下 include include include using namespace std const int maxn 105,maxk 15 int n...
BZOJ1084 SCOI2005 最大子矩陣
bzoj1084 scoi2005 最大子矩陣 這裡有乙個n m的矩陣,請你選出其中k個子矩陣,使得這個k個子矩陣分值之和最大。注意 選出的k個子矩陣不能相互重疊。第一行為n,m,k 1 n 100,1 m 2,1 k 10 接下來n行描述矩陣每行中的每個元素的分值 每個元素的分值的絕對值不超過32...