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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ 2411 Mondriaan's Dream [经典状态压缩dp]

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 2411 Mondriaan's Dream [经典状态压缩dp] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:略。

思路:這一題開始做的時候完全沒有思路,便去看了別人的題解。

首先,對于這個題目解法想有一個初步的了解,請看這里:http://www.2cto.com/kf/201208/146894.html

根據這篇講解,寫了一篇扭曲的代碼,提交之后TLE。

經過排查分析之后發現,算法的復雜度為O(hw*(2^(2w))),這個復雜度肯定超了。后來進行了優化,如果兩種狀態可以匹配,就將它們用鄰接表(vector實現)存儲起來,這樣只需一遍預處理,以后直接讀取就可以了。

此外,還有兩個地方的優化:

1. 如果h*w為奇數,則結果必為0。(每個磚塊的面積為2,無法用整數塊鋪滿)

2. 如果h < w, 將兩者數值交換。

后面還有一種dfs+dp的解法,我覺得很精巧,在下面重點分析。這里先貼下上面方法的代碼。

1 #include<stdio.h> 2 #include<iostream> 3 #include<vector> 4 #include<string.h> 5 #include<algorithm> 6 using namespace std; 7 long long dp[1<<12][13]; 8 vector<int> ok[1<<12]; 9 int h, w; 10 bool judge(int up, int down) 11 { 12 int u[13], d[13]; 13 int now = w; 14 while (now) 15 { 16 u[now] = up % 2; 17 d[now--] = down % 2; 18 up /= 2; 19 down /= 2; 20 } 21 for (int i = 1; i <= w;) 22 { 23 if (!d[i])//該行該位為0 24 { 25 if (!u[i]) return 0;//上一行若也為0,則不合法 26 i++; 27 } 28 else if (!u[i])//該行該位為1,且上一行該位為0 29 i++; 30 else//該行該位為1,且上一行該位也為1 31 { 32 if (i + 1 > w || !d[i+1] || !u[i+1]) return 0; 33 i += 2; 34 } 35 } 36 return 1; 37 } 38 long long getdp() 39 { 40 memset(dp, 0, sizeof(dp)); 41 for (int i = 0; i < (1<<w); i++) 42 { 43 ok[i].clear(); 44 for (int j = 0; j < (1<<w); j++) if (judge(j, i)) 45 ok[i].push_back(j); 46 } 47 for (int i = 0; i < (1 << w); i++) 48 for (int j = 0; j < ok[i].size(); j++) if (ok[i][j] == (1<<w) - 1) 49 dp[i][1] = 1; 50 for (int i = 2; i <= h; i++) 51 for (int j = 0; j < (1 << w); j++) 52 for (int k = 0; k < ok[j].size(); k++) 53 dp[j][i] += dp[ ok[j][k] ][i-1]; 54 return dp[(1<<w)-1][h]; 55 } 56 int main() 57 { 58 while (~scanf("%d%d", &h, &w) && h && w) 59 { 60 if ((h * w) % 2) 61 { 62 printf("0\n"); 63 continue; 64 } 65 if (h < w) swap(h, w); 66 printf("%lld\n", getdp()); 67 } 68 return 0; 69 }

===========分割線===============

dfs的方法:

狀態壓縮的原則與上一種方法是一樣的:如果該位為0,則說明該處為一豎放的磚塊,且為該磚塊的上半部分;其余為1。

核心部分是dfs的方法。首先,dp[state][row]表示鋪到第row行,且該行狀態為state時的方法總數,這并沒有變。每次枚舉狀態,與上面不同的是,枚舉的是上一層的狀態。

上一種方法:

for(i = 2; i <= h; i++)//枚舉行數

  for(j = 0; j < (1<<w); j++)//枚舉該行的狀態

    for(k...)//枚舉該行可匹配的上一行狀態

dfs版:

for(i = 2; i <= h; i++)//枚舉行數

?

  for(j = 0; j < (1<<w); j++)//枚舉上一行的狀態

?

    if(...) dfs(...)//如果上一行該狀態方法數不為0,則dfs遍歷該行可行狀態

遍歷的方法很巧妙:假設所枚舉到的上一行狀態為s,則將s每一位都取反便是該行的一種可行狀態。因為,如果s的某一位是0,說明這是一豎放磚塊的上半部分,取反后恰好就是下半部分對應的1;如果s某一位是1,取反后是0,這當然也是可行的。

又由于當s某一位是1時,下一行對應的位可以是0或者1(若是1則必然是橫放的,需要連續兩位狀態都是1)。所以在dfs的過程中需要遍歷所有兩個0相鄰的情況,將他們置為1。當dfs的下標pos到達最后一位(即pos=w)時,說明該狀態是可行的,就將該狀態的dp值加上上一行狀態s的dp值。因此,每次dfs之前都需要暫時存儲下上一行狀態s的dp值。

這種方法代碼既短又巧妙,讓人佩服啊。

?

1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 using namespace std; 5 long long dp[1<<12][13], tem, h, w; 6 void dfs(int row,int state,int pos) 7 { 8 if (pos == w) 9 { 10 dp[state][row] += tem; 11 return; 12 } 13 dfs(row, state, pos + 1); 14 if (pos <= w - 2 && !(state & (1<<pos)) && !(state & (1<<(pos + 1)))) 15 dfs(row, state | 1<<pos | 1<<(pos+1), pos + 2); 16 } 17 int main() 18 { 19 while (~scanf("%d%d", &h, &w) && h && w) 20 { 21 if (h * w % 2) 22 { 23 printf("0\n"); 24 continue; 25 } 26 if (h < w) swap(h, w); 27 memset(dp, 0, sizeof(dp)); 28 tem = 1; 29 dfs(1, 0, 0); 30 for (int i = 2; i <= h; i++) 31 for (int j = 0; j < (1<<w); j++) if (dp[j][i-1]) 32 { 33 tem = dp[j][i-1]; 34 dfs(i, ~j & ((1<<w) - 1), 0); 35 } 36 printf("%lld\n", dp[(1<<w)-1][h]); 37 } 38 return 0; 39 }

?

?

?

轉載于:https://www.cnblogs.com/fenshen371/p/3269801.html

總結

以上是生活随笔為你收集整理的POJ 2411 Mondriaan's Dream [经典状态压缩dp]的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 午夜影院在线观看18 | 久久亚洲热 | 推特裸体gay猛交gay | 久久加勒比 | 免费视频毛片 | 色永久| 国产成人无码aa精品一区 | 新中文字幕 | 成人看片在线观看 | 51吃瓜网今日吃瓜 | 玉足女爽爽91 | 极品videosvideo喷水 | 欧美高潮视频 | 日日爽视频 | 国产成人无码性教育视频 | 一级精品视频 | 亚洲精品无码专区 | 色乱码一区二区三区 | 黄色男同视频 | 久久亚洲精选 | 午夜精品久久久久久久爽 | 韩国美女主播跳舞 | 97视频人人 | 欧美第1页 | 成人欧美一区二区三区 | 亚洲天堂福利 | av一卡二卡 | 国产人人爱 | 91xxx在线观看 | 噜噜av| 久艹在线播放 | 欧美一级不卡 | 日本一区二区三区免费视频 | 欧美精品一区二区蜜桃 | 超碰牛牛 | 香蕉视频97| 麻豆亚洲 | 久久久久久av无码免费网站 | 91麻豆精品国产理伦片在线观看 | aaa影院| 老司机福利院 | 字幕网在线观看 | 伊人96| 免费在线黄色网址 | 久久国产影院 | 91一二区| 久久久久久久无码 | 久久精品大片 | 国产精品啪啪啪视频 | 无码乱人伦一区二区亚洲 | 五月天婷婷导航 | 在线艹 | 久久久久久少妇 | 韩国三级久久 | 激情综合影院 | 亚洲激情黄色 | 欧美老肥妇做爰bbww | 欧美日韩丝袜 | 成人免费黄色片 | 日本特级黄色录像 | 欧美在线日韩 | 五月天中文字幕在线 | 欧美日韩国产高清 | 国产成人无码精品久久久久久 | 一级做a爰片久久毛片潮喷 天天透天天干 | 日韩三区视频 | 中文字幕无人区二 | 无限国产资源 | 95视频在线| 撸大师av | 一级特级黄色片 | 成人短视频在线免费观看 | 日毛片| 日本特级毛片 | 国产一级片免费视频 | av片免费播放 | 一级特毛片 | 男生和女生一起差差差视频 | 色综合av综合无码综合网站 | 校霸被c到爽夹震蛋上课高潮 | 国产又粗又猛又爽69xx | 欧美日韩亚洲高清 | 91视频最新| 91性高潮久久久久久久久 | 中文字幕在线免费 | 久久久久国产精品区片区无码 | xxx性日本 | 悠悠av | 欧美黑人性xxx猛交 少妇无套内谢久久久久 | www国产com | 全黄一级片| 美女光屁屁露胸胸 | 国产重口老太伦 | 久久中文网 | 超污视频在线观看 | 老司机精品福利视频 | a在线看 | 成年人免费小视频 | 少妇人妻偷人精品一区二区 |