UVa 11270 鋪放骨牌(輪廓線DP)

2022-06-20 21:30:10 字數 1140 閱讀 1229

題意:用1×2骨牌覆蓋n×m棋牌,有多少種方法?

思路:這道題目是典型的輪廓線dp題。

所謂輪廓線dp,就是以整行整列為狀態進行動態規劃時無法進行狀態轉移,那麼此時就可以用到輪廓線,當然,這種方法只能使用在乙個窄棋盤上,大了肯定是不行的,要超時!

'輪廓線dp就是按照從上到下,從左到右的順序進行狀態轉移,每個格仔用二進位制來表示狀態,1代表的就是覆蓋,0代表未覆蓋。

以本題為例,如上圖,我們現在要計算 k 格仔,那麼與它有關的就是k4 k3 k2 k1 k0這5個格仔。

現在,我們對於每個格仔都有三種決策:

1、不放

不放的條件是其上面的格仔必須是1(也就是k4必須是1),否則無法覆蓋所有的棋盤的。

如果滿足條件,那麼就進行狀態轉移,d[cur][新狀態]+=d[1-cur][舊狀態],也就是d[cur][k3k2k1k0k]+=d[1-cur][k4k3k2k1k0]

2、上放

上放的條件是其上面的格仔必須是0。

3、左放

左放的條件其左邊的格仔必須是0。

具體的演算法實現請參見**。

注意:這道題目陣列開小點,開到1<<15會tle,11就可以了!!

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef pairpll;

const int inf = 0x3f3f3f3f;

const int maxn=11;

int n,m;

int cur;

ll d[2][1<

void update(int a,int b) //a是m位的舊狀態,b是m+1位的新狀態

//因為輪廓線首位1,所以b^(1<

int main()}}

printf("%lld\n",d[cur][(1<

}return 0;

}

瓷磚鋪放(遞迴)

1 問題描述2 有一長度為n 1 10 的地板,給定兩種不同瓷磚 一種長度為1,另一種長度為2,數目不限。要將這個長度為n的地板鋪滿,一共有多少種不同的鋪法?3 例如,長度為4的地面一共有如下5種鋪法 4 4 1 1 1 15 4 2 1 16 4 1 2 17 4 1 1 28 4 2 29 程式...

演算法訓練 瓷磚鋪放

問題描述 有一長度為n 1 10 的地板,給定兩種不同瓷磚 一種長度為1,另一種長度為2,數目不限。要將這個長度為n的地板鋪滿,一共有多少種不同的鋪法?例如,長度為4的地面一共有如下5種鋪法 4 1 1 1 1 4 2 1 1 4 1 2 1 4 1 1 2 4 2 2 程式設計用遞迴的方法求解上述...

C語言 瓷磚鋪放

演算法訓練 瓷磚鋪放 時間限制 1.0s 記憶體限制 512.0mb 錦囊1遞迴或遞推。問題描述 有一長度為n 1 10 的地板,給定兩種不同瓷磚 一種長度為1,另一種長度為2,數目不限。要將這個長度為n的地板鋪滿,一共有多少種不同的鋪法?例如,長度為4的地面一共有如下5種鋪法 4 1 1 1 1 ...