bzoj
洛谷比較簡單的dp
d
p設f[
i][j
] f[i
][j]
表示當前已經匹配到了原串的第
i i
個位置,上乙個
m' role="presentation">mm在第
j j
個字元之後的方案數。
每次從當前f[
i][j
]' role="presentation">f[i
][j]
f[i]
[j]位置轉移出去,轉移只有兩種。
一種是直接匹配一位,也就是f[
i][j
]−>f[
i+1]
[j] f[i
][j]
−>f[
i+1]
[j],
另外一種是在後面新增
r r
,列舉一下後面新增幾個
r' role="presentation">rr,用
hash
h as
h判斷插入進來是否可行就好了。
時間複雜度大概是o(
n2lo
gn) o(n
2log
n)
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define ull unsigned long long
#define rg register
#define max 55
inline
int read()
const
int base=233;
ull hash[max],pw[max];
char ch[max];
int n,f[max][max],ans=1e9;
ull val(int l,int r)
int main()}}
for(int j=0;jprintf("%d\n",ans);
return
0;}
BZOJ2064狀態壓縮動態規劃
n1和n2都小於等於10,考慮狀態壓縮動態規劃 預處理 d i j 表示開始狀態的子集i,變成結束狀態的子集j所需要的步數。這裡需要i的面積和與j的面積和相等,所需要的步數是暴力合併i和暴力拆分j的步數 dp f i j 表示當前剩餘狀態開始狀態的i,和結束狀態的j。列舉i的子集p j 1 n2 1...
狀態壓縮動態規劃
動態規劃的狀態有時候比較難,不容易表示出來,需要用一些編碼技術,把狀態壓縮的用簡單的方式表示出來。典型方式 當需要表示乙個集合有哪些元素時,往往利用2進製用乙個整數表示。一般有個資料 n 16 或者 n 32 這個很可能就是狀態dp的標誌,因為我們要用乙個int的二進位制來表示這些狀態。要注意好這些...
動態規劃 狀態壓縮
這個題目的題意很容易理解,在乙個n m的格仔裡,我們現在有兩種型別的磚塊,1 2和 2 1,問一共有多少種方案,可以將整個n m的空間都填滿。最簡單的例子就是下面的了 程式設計之美中題目 某年夏天,位於希格瑪大廈四層的微軟亞洲研究院對辦公樓的天井進行了一次大規模的裝修.原來的地板鋪有 n m 塊正方...