BZOJ1084 SCOI2005 最大子矩陣

2021-07-27 13:12:33 字數 1586 閱讀 2103

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...