日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj2411 Mondriaan's Dream (状压dp+多米诺骨牌问题)

發布時間:2025/7/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj2411 Mondriaan's Dream (状压dp+多米诺骨牌问题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這道題的解析這個博客寫得很好

https://blog.csdn.net/shiwei408/article/details/8821853

大致意思就是我們可以只處理兩行之間的關系,然后通過這兩個關系推出所有行(有點像矩陣快速冪的思想)

幾個要注意的地方

(1)第0行為全1

(2)發現自己的思維習慣還是先行在狀態,我自己寫得時候老是寫反。

(3)path的個數可能有很多,不只是1<<n,可以輸入極限數據然后輸出路徑的數目作為數組空間大小

(4)拿小的作列

(5)這道題是人為的設置一種方式,使得二進制與骨牌是一一對應的

如果是橫放,就1 1 如果是豎放就 0 如果不放就是 1

? ? ? ? ? ? ? ? ? ? ? ?? 11 ? ? ? ? ? ? ? ? ? ? ?? 1 ? ? ? ? ? ? ? ? ? ? ?? 0

然后這里的二進制操作非常的秀,要認真學習

#include<cstdio> #include<cstring> #include<algorithm> #define REP(i, a, b) for(int i = (a); i < (b); i++) #define _for(i, a, b) for(int i = (a); i <= (b); i++) using namespace std;typedef long long ll; const int MAXN = 15; ll dp[MAXN][2100]; int path[14000][2], p, n, m;void dfs(int l, int now, int pre) {if(l > m) return;if(l == m){path[p][0] = pre;path[p++][1] = now;return;}dfs(l + 2, (now << 2) | 3, (pre << 2) | 3);dfs(l + 1, (now << 1) | 1, pre << 1);dfs(l + 1, now << 1, (pre << 1) | 1); }int main() {while(~scanf("%d%d", &n, &m) && n){memset(dp, 0, sizeof(dp));if(m > n) swap(n, m);p = 0;dfs(0, 0, 0);dp[0][(1<<m)-1] = 1;_for(i, 1, n)REP(j, 0, p)dp[i][path[j][1]] += dp[i-1][path[j][0]];printf("%lld\n", dp[n][(1<<m)-1]);}return 0; }

?

轉載于:https://www.cnblogs.com/sugewud/p/9819323.html

總結

以上是生活随笔為你收集整理的poj2411 Mondriaan's Dream (状压dp+多米诺骨牌问题)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。