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