題意:用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 ...