Bzoj1084 SCOI2005 最大子矩陣

2022-05-20 04:37:15 字數 2012 閱讀 3459

題目鏈結

一開始沒仔細看題tat,後來發現「1≤m≤2」。。。

這提示我萌什麼?

我把解法分為m=1和m=2兩種情況

首先,sum[i,j]為第j列的字首和,即表示第j列前i行各個數字的和

①當m=1 時:

用f[i,j]表示前i個數,取了j個矩陣的最優值

目標狀態:f[n,k]

狀態轉移:f[i,j]=max(f[i-1,j],f[k,j-1]+sum[i,1]-sum[k,1])(0<=k<=i-1)

②當m=2 時:

用w[i,j,k]表示第一列取到第i個數,第二列取到第j個數,取了k個矩陣的最優值

目標狀態:f[n,n,k]

狀態轉移:f[i,j,k]=max(w[i-1,j,k],w[i,j-1,k]//不取

w[ii,j,k-1]+sum[i,1]-sum[ii,1] ,

w[i,jj,k-1]+sum[j,2]-sum[jj,2]//分別在兩列取

(當i=j時)w[ii,ii,k-1]+sum[i,1]+sum[i,2]-sum[ii,1]-sum[ii,2]//在兩列都取)

【code】:

vari,j,k,n,m,t,ii,jj:integer;

tot,cnt,ans:longint;

sum:array[0..110,0..2]of longint;

f:array[0..110,0..12]of longint;

w:array[0..110,0..110,0..12] of

longint;

function max(i,j:longint):longint;

begin

if i>j then exit(i);exit(j);

end;

begin

readln(n,m,k);

fillchar(sum,sizeof(sum),0);

for i:=1 to n do begin

for j:=1 to m do

begin

read(t);

sum[i,j]:=sum[i-1,j]+t;

end;

readln;

end;

if m=1 then begin

fillchar(f,sizeof(f),0);

for i:=0 to n+1 do

f[i,0]:=0;

for i:=1 to n do

forcnt:=1 to k do begin

f[i,cnt]:=f[i-1,cnt];

for j:=0 to i-1 do

f[i,cnt]:=max(f[i,cnt],f[j,cnt-1]+sum[i,1]-sum[j,1]);

end;

writeln(f[n,k]);

endelse begin

fillchar(w,sizeof(w),0);

for i:=1 to n do

forj:=1 to n do begin

w[i,j,0]:=0;

for cnt:=1 to k do begin

w[i,j,cnt]:=max(w[i-1,j,cnt],w[i,j-1,cnt]);

for ii:=0 to i-1 do

w[i,j,cnt]:=max(w[i,j,cnt],w[ii,j,cnt-1]+sum[i,1]-sum[ii,1]);

for jj:=0 to j-1 do

w[i,j,cnt]:=max(w[i,j,cnt],w[i,jj,cnt-1]+sum[j,2]-sum[jj,2]);

if i=j then

for ii:=0

to i-1 do

w[i,j,cnt]:=max(w[i,j,cnt],w[ii,ii,cnt-1]+sum[i,1]+sum[i,2]-sum[ii,1]-sum[ii,2]);

endend;

writeln(w[n,n,k])

endend.

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 最大子矩陣

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

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