題目傳送門
區間dp
一道模擬賽的題目,然後一直在推 fl,
rf_
fl,r
為 [l,
r]
[l,r]
[l,r
] 區間的最大貢獻的轉移一直沒搞出來,後來發現由於刪除一塊會使得兩端顏色相同的塊合併就很難轉移,於是我們多記錄一維 fl,
r,sf_
fl,r,s
表示 [l,
r]
[l,r]
[l,r
] 區間內以及在 (r,
n]
(r,n]
(r,n
] 這段區間緊接 r
rr 的與 col
rcol_r
colr
相同的個數為 sss。
轉移我們分兩種情況轉移:
( 1)
(1)(1
) 直接搞掉後面那一段,那麼轉移:fl,
r,s=
fl,r
−1,0
+(s+
lenr
)2
f_=f_+(s+len_r)^2
fl,r,s
=fl
,r−1
,0+
(s+l
enr
)2,這個理解不難的。
( 2)
(2)(2
) 我們在 [l,
r)
[l,r)
[l,r
) 這段區間裡找乙個 i
ii 使得 col
i=co
lr
col_i=col_r
coli=
colr
,這時候我們是刪掉 (i,
r)
(i,r)
(i,r
) 這段區間使得 i,r
i,ri,
r 合併。此時轉移為:fl,
r,s=
maxi=
lr−1
(fl,
r,s,
fl,i
,len
r+s+
fi+1
,r−1
,0
)f_=\max\limits_^(f_,f_+f_)
fl,r,s
=i=
lmaxr−
1(f
l,r,
s,f
l,i,
lenr
+s
+fi+
1,r−
1,0
)。這樣時間複雜度: o(n
4)
o(n^4)
o(n4
)
#include
#define for(i,a,b) for ( int i=(a);i<=(b);i++ )
#define dow(i,b,a) for ( int i=(b);i>=(a);i-- )
#define go(i,x) for ( int i=head[x];i;i=e[i].nex )
#define mem(x,s) memset(x,s,sizeof(x))
#define cpy(x,s) memcpy(x,s,sizeof(x))
#define yes return puts("yes"),0
#define no return puts("no"),0
#define gg return puts("-1"),0
#define pb push_back
#define sqr(x) ((x)*(x))
using
namespace std;
struct io
inline
chargc(
)inline
bool
blank
(char ch)
template
<
class
t>
inline
void
read
(t &x)
inline
void
read
(char
*s)inline
void
read
(char
&c)template
<
class
t>
inline
void
write
(t x)
}} io;
const
int mod=
1e9+7;
const
int mo=
998244353
;const
int n=
2e2+5;
int n,m,col[n]
,len[n]
,pre[n]
,f[n]
[n][n]
,ans;
intmain()
io.write
(f[1
][n][0
]);return0;
}
洛谷P2135 方塊消除
洛谷題目鏈結 動態規劃 真毒瘤!變數宣告 val i 表示第 i 塊顏色 num i 表示第 i 塊顏色數量 sum i 表示 num 的字首和 我們設計狀態 f l r k 表示區間 l,r 中,後面還有 k 個與 val r 相同的數字 那麼初始化如下 f l r k f l r 1 0 num...
題解 P1004 方格取數
傳送門 動態規劃yes?設i為路徑長度,為什麼i這一維可以省掉見下 f j k 表示第乙個點到了 j,i j 第二個點到了 k,j k 則int ji i j,ki i k f j k max f j k f j 1 k 1 f j k max f j k f j 1 k f j k max f j...
P2774 方格取數問題 題解
題目鏈結 這道題目解法很妙,主要用到了最大和 總和 最小捨棄和。最小捨棄和即最小割 我們構造出乙個二分圖滿足割掉 捨去 我們又知最小割 最大流,所以是一道最大流問題。考慮建圖 我們發現,只要兩個點相鄰 不相容 那麼這兩個點的橫縱座標和的奇偶性一定不同,即 x i y i bmod 2 neq x j...