• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Why so serious? --[NKU]schindlerlee

            2010年1月11日星期一.sgu131 pku2411 狀態壓縮動態規劃

            2010年1月11日星期一.sgu131 pku2411
            狀態壓縮動態規劃。

            pku2411:
            給一個m*n(m,n<=11)的棋盤,用1*2和2*1的矩形覆蓋這個棋盤,問有多少中方法對這個棋盤進行
            完全覆蓋。

            這題有組合數學上的公式,但是只能對棋盤上沒有障礙的情況有用,如果遇到有障礙的情況,只能
            利用容斥原理進行計算,但是進行容斥原理的會非常復雜。

            其實一看到數據范圍就應該想到使用位運算的狀態壓縮動態規劃。

            主要的程序是
            a表示要鋪滿的這一行的狀態,b表示的是鋪滿上一行的狀態a產生的下一行狀態。
            然后使用狀態b繼續遞推。
             1 
             2 #include<iostream>
             3 #include<cstdio>
             4 #include<cstdlib>
             5 #include<cstring>
             6 #include<algorithm>
             7 using namespace std;
             8 typedef long long LL;
             9 const int maxint = 0x7fffffff;
            10 const long long max64 = 0x7fffffffffffffffll;
            11 #define bin(i) (1 << i)  /*1左移i位*/
            12 #define emp(a,i) (!(a & bin(i))) /*判斷a的i位是否位0*/
            13 
            14 const int N = 1 << 11;
            15 LL f[N], g[N];
            16 int m, n;
            17 int full;
            18 
            19 void dfs(int a, int b, LL k)
            20 {
            21     if (a == full) {  //將a鋪滿之后形成的所有下一行狀態b的鋪法都有k種
            22         g[b] += k; //產生b的所有狀態求和
            23         return;
            24     }
            25     for (int i = 0; i < m; i++) {
            26         if (emp(a, i)) {
            27             if (i < m - 1 && emp(a, i + 1)) {
            28                 dfs(a | bin(i) | bin(i + 1), b, k);  //橫鋪
            29             }
            30             if (emp(b, i)) {
            31                 dfs(a | bin(i), b | bin(i), k);  //豎鋪
            32             }
            33             break;
            34         }
            35     }
            36 }
            37 
            38 int main()
            39 {
            40   int i, j, k;
            41   while(scanf("%d%d"&m, &n) == 2 && m && n) {
            42       memset(f,0,sizeof(f));
            43       memset(g,0,sizeof(g));
            44       full = (1 << m) - 1;
            45       f[full] = 1;
            46       for (k = 0; k <= n; k++) {
            47           for (i = 0; i <= full; i++) {
            48               if (f[i]) { //如果此行的狀態i可達
            49                   dfs(i, 0, f[i]);
            50               }
            51           }
            52           for (i = 0; i <= full; i++) {
            53               f[i] = g[i];
            54               g[i] = 0;
            55           }
            56       }
            57       cout << f[0<< endl;
            58   }
            59   return 0;
            60 }
            61 

            sgu131:pku2411的加強版
            多了L型的瓷磚。這個最好是自己考慮一下,其實就是比上邊的代碼多了幾行

            const int N = 512;
            LL f[N], g[N];
            int m, n;
            int full;

            void dfs(int a, int b, LL k)
            {
                
            if (a == full) {  //將a鋪滿之后形成的所有下一行狀態b的鋪法都有k種
                    g[b] += k;
                    
            return;
                }
                
            for (int i = 0; i < m; i++) {
                    
            /* 六種鋪法,按以下順序分別是
            a:##  ##  ##  #  #    #
            b:    #    #  #  ##  ##
                     * 
            */
                    
            if (emp(a, i)) {
                        
            if (i < m - 1 && emp(a, i + 1)) {
                            dfs(a 
            | bin(i) | bin(i + 1), b, k);
                            
            if (emp(b, i))
                              dfs(a 
            | bin(i) | bin(i + 1), b | bin(i), k);
                            
            if (emp(b, i + 1))
                              dfs(a 
            | bin(i) | bin(i + 1), b | bin(i + 1), k);
                        }
                        
            if (emp(b, i)) {
                            dfs(a 
            | bin(i), b | bin(i), k);
                            
            if (i > 0 && emp(b, i - 1))
                              dfs(a 
            | bin(i), b | bin(i) | bin(i - 1), k);
                            
            if (i < m - 1 && emp(b, i + 1))
                              dfs(a 
            | bin(i), b | bin(i) | bin(i + 1), k);
                        }
                        
            break;
                    }
                }
            }



            posted on 2010-01-13 22:11 schindlerlee 閱讀(1184) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告

            伊人伊成久久人综合网777| 狠狠精品久久久无码中文字幕| 久久久国产打桩机| 久久99热国产这有精品| 久久伊人精品青青草原高清| 久久夜色精品国产亚洲| 蜜臀久久99精品久久久久久小说 | 久久无码AV中文出轨人妻| A级毛片无码久久精品免费| 久久精品国产只有精品66| 久久99国产精品尤物| 国内精品久久国产| 精品多毛少妇人妻AV免费久久| 奇米综合四色77777久久| 久久久久久亚洲精品不卡| 久久婷婷色综合一区二区| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久免费小视频| 久久人人爽人人爽人人片AV不| 国产精品女同久久久久电影院 | www.久久热.com| 国产精品久久国产精品99盘| 久久久久久久亚洲Av无码| 狠狠色婷婷久久一区二区三区 | 久久精品国产久精国产| 看久久久久久a级毛片| 日本精品久久久久中文字幕8 | 青青草原综合久久大伊人导航 | 99精品久久久久久久婷婷| 无码人妻久久一区二区三区蜜桃| 久久影院午夜理论片无码| 色婷婷综合久久久中文字幕 | 国产亚洲美女精品久久久| 国产精品久久久99| 日产精品久久久久久久| 久久无码国产| 久久久精品免费国产四虎| 亚洲国产精品高清久久久| 久久国产精品国语对白| 91精品国产综合久久精品| 免费一级做a爰片久久毛片潮|