ZOJ2563 之狀態壓縮dp

2021-06-21 09:22:50 字數 1510 閱讀 7360

long dominoes

time limit: 2 seconds      

memory limit: 65536 kb

find the number of ways to tile an m*n rectangle with long dominoes -- 3*1 rectangles.

each domino must be completely within the rectangle, dominoes must not overlap (of course, they may touch each other), each point of the rectangle must be covered.

input

the input contains several cases. each case stands two integers m and n (1 <= m <= 9, 1 <= n <= 30) in a single line. the input ends up with a case of m = n = 0.

output

output the number of ways to tile an m*n rectangle with long dominoes.

sample input

3 3

3 10

0 0

sample output

2

28

於是判斷兩個狀態i,j是否相容就有了這個判斷:

bool check(int i,int j)}}

return true;

}其他就是基本的狀態壓縮模版了

#include #include #include #include #include #include #include #include #include #define inf 99999999

typedef long long ll;

using namespace std;

const int max=20000+10;

int n,m;

int digit[13],bin[13];

ll dp[max],temp[max];//對應j位為0表示第j位豎著,2表示j-1位豎著,1表示j被填充

bool check(int i,int j)

if(digit[k] == 0)

if(digit[k] == 2)

if(digit[k] == 1)

}void dp()

if(digit[k] == 0)

if(digit[k] == 2)

if(digit[k] == 1)

}void dp(){

int bit=1,num=1;

for(int i=1;i<=m;++i)bit=bit*3,num=num+bit;

num-=bit;

memset(temp,0,sizeof temp);

for(int i=0;i

zoj3755 狀態壓縮dp

很久沒有1a了 爽 題目也是很常規的狀態壓縮題目,這類題目一般都是預處理所有狀態,然後通過列舉,判斷是否符合要求,再從符合要求的末狀態中找到答案即可。這個題目,由於給定的是所有偶數列,那麼,可以想到,每一列只跟左右兩列有關,其他列對其沒有影響。因此,只需要確定了兩列中的一列的狀態,另外一列便可以列舉...

zoj 3471 狀態壓縮dp

題目大意 不超過10種氣體,兩兩之間相互碰撞可以產生一定的能量,如a碰b,那麼b氣體就消失,自身不能碰自身,問最後所能得到的最大能量。題目解析 用10位二進位制表示氣體是否存在,0表示存在,1表示不存在,s 上乙個狀態 中的兩種氣體碰撞並且有一種消失,可以得到news的狀態 狀態轉移 狀態表示 dp...

ZOJ 3802 (狀態壓縮dp)

首先,最樸素的思想為暴搜所有解o 2 n 不可接受 已d i j 代表前 i 個數字 裡 已作出選擇後產生的序列記為 j j 最大為 16,8,4,2全部除以壓縮一下 4000 注意 j 儲存的是乙個序列經產生所屬運算後最後的遞減數數列 舉個栗子 14 8 4 2 當添入 2 變為 16,添入 4 ...