POJ 狀態壓縮DP專題

2021-07-26 09:35:28 字數 1878 閱讀 3143

poj3254

狀態壓縮dp的入門題。純粹的二維遞推,還可以通過滾動陣列優化,但這裡並不需要。

#include 

#include

#include

using

namespace

std;

int m,n,f[13][1

<<12];

intmap[13];

int in()

bool check(int j,int k)

int main()

for ( int i=0;i<=(1

<1;i++)

if(check(map[1],i))

f[1][i]=1;

for ( int i=2;i<=m;i++)

for ( unsigned

int j=0;j<=(1

<1;j++)

if(check(map[i],j))}

for ( int i=0;i<=(1

<1;i++)

cout

<< ans << endl;

return

0; }

poj1185

一道debug了一天一夜的題目。

將炮兵的放法狀壓,離散掉。然後預處理出前兩行的情況。隨後進行遞推,每次列舉該行,前一行和前兩行的狀態即可。

#include 

#include

#include

#include

#include

using

namespace

std;

int f[101][70][70];

int n,m;

unsigned

intlist[2000],num[2000],cnt=0;

unsigned

intmap[100];

char in()

int main()

list[cnt++]=i;

}for ( int i=0;i<=100;i++)

for ( int j=0;j<=cnt;j++)

for ( int k=0;k<=cnt;k++)

f[i][j][k]=-1;

for ( int i=1;i<=n;i++)

map[i]=temp;

} for ( int j=0;jif(!((~map[1])&list[j]))

f[1][j][0]=num[j];

for ( int i=2;i<=n;i++)

}} int ans=0;

for ( int j=0;jfor ( int k=0;kcout

<< ans << endl;

return

0; }

poj2441

與第一題較為相似,但是此處必須使用滾動陣列來優化,(記憶體限制是65536kb),而且不需要取模。其他都是一些遞推的套路,嚴格來說算不上動歸。

#include 

#include

#include

using

namespace

std;

int f[2][1

<<20];

int matrix[21];

int main()

int ans=0;

for ( int i=0;i<=(1

<1;i++)

ans+=f[n&1][i];

cout

<< ans << endl;

return

0; }

poj 2411 狀態壓縮DP

用乙個vector容器來記錄當前狀態下有哪些狀態可以繼承。比如說vec i 裡面的所有的數代表當第一行為i狀態時,第二行的可行狀態。對於狀態i,其二進位制中0的地方表示為當前狀態為豎著的木板的下半部分。其二進位制中1的地方表示為當前狀態為橫著的木板或者豎著的木板的上半部分。include inclu...

poj 1185 狀態壓縮DP

這題開始直接狀態壓縮每行 2 m 然後就tle了。最後看了下別人的發現其實每行的狀態沒有這麼多,因為相鄰兩個大炮的距離不能小於2 所以當m為10 的時候每行的狀態只有60種,每次在得到m的時候,直接搜出這些狀態儲存起來,然後就可以了。ac 如下 include include include inc...

POJ 2411 狀態壓縮DP

題目大意 給乙個h w的方格,現給出1 2和2 1的兩種小方塊,求出把h w方格鋪滿的不同方案數 1 h,w 11 分析 首先能想到的是如果h w為奇數,那麼肯定不能放滿,結果為0 如何表示狀態 從題目看資料很小,那麼很容易想到用二進位制來表示狀態,0表示當前方格沒放,1表示放了 這裡用dp r c...