• <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>
            經(jīng)典的狀態(tài)壓縮DP。f[i][j]表示第i行,方格排布為二進(jìn)制數(shù)j(第k位上為1表示凸出一個(gè)格子,為0表示不凸出)的方案數(shù)。用DFS進(jìn)行狀態(tài)轉(zhuǎn)移。
            如果行數(shù)比較多的話,可以用矩陣乘法優(yōu)化。因?yàn)槊啃械臓顟B(tài)轉(zhuǎn)移都是相同的。設(shè)烈數(shù)為m,行數(shù)為n,可以做到O(23mlogn)。

            /*************************************************************************
            Author: WHU_GCC
            Created Time: 2007-8-28 20:53:12
            File Name: pku2411.cpp
            Description: 
            ***********************************************************************
            */

            #include 
            <iostream>
            long long f[12][2048], n, m;
            void dfs(int i, int j, int jj, int s)
            {
                
            if (s == m)
                    f[i 
            + 1][jj] += f[i][j];
                
            else if ((jj & (1 << s)) == 0)
                
            {
                    dfs(i, j, jj 
            | (1 << s), s + 1);
                    
            if (s < m - 1 && (jj & (1 << (s + 1))) == 0) dfs(i, j, jj, s + 2);
                }

                
            else
                    dfs(i, j, jj 
            & ~(1 << s), s + 1);
            }

            int main()
            {
                
            while (scanf("%d%d"&n, &m), n + m != 0)
                
            {
                    memset(f, 
            0sizeof(f));
                    f[
            0][0= 1;
                    
            for (int i = 0; i < n; i++)
                        
            for (int j = 0; j < (1 << m); j++)
                            
            if (f[i][j])
                                dfs(i, j, j, 
            0);
                    printf(
            "%I64d\n", f[n][0]);
                }

                
            return 0;
            }
            posted on 2007-08-28 21:03 Felicia 閱讀(1418) 評(píng)論(12)  編輯 收藏 引用 所屬分類: 動(dòng)態(tài)規(guī)劃
            Comments
            • # re: [動(dòng)態(tài)規(guī)劃]pku2411
              ACLover
              Posted @ 2007-09-20 12:45
              可不可以講下具體怎么狀態(tài)轉(zhuǎn)移啊,
              太精簡了,看不懂。  回復(fù)  更多評(píng)論   
            • # re: [動(dòng)態(tài)規(guī)劃]pku2411
              Felicia
              Posted @ 2007-09-20 18:27
              @ACLover
              呵呵,這么簡單,你一定想的通的  回復(fù)  更多評(píng)論   
            • # re: [動(dòng)態(tài)規(guī)劃]pku2411
              啊水電費(fèi)
              Posted @ 2007-10-09 23:05
              if (s < m - 1 && (jj & (1 << (s + 1))) == 0) dfs(i, j, jj, s + 2);
              這句話沒有看懂!  回復(fù)  更多評(píng)論   
            • # re: [動(dòng)態(tài)規(guī)劃]pku2411
              啊水電費(fèi)
              Posted @ 2007-10-09 23:06
              如果前一行狀態(tài)對(duì)應(yīng)的位是0,下一行對(duì)應(yīng)位可以取0or1?  回復(fù)  更多評(píng)論   
            • # re: [動(dòng)態(tài)規(guī)劃]pku2411
              Felicia
              Posted @ 2007-10-10 08:48
              @啊水電費(fèi)
              就這兩種狀態(tài)轉(zhuǎn)移,分別對(duì)應(yīng)橫著放和豎著放
              00 -> 00
              0 -> 1  回復(fù)  更多評(píng)論   
            • # re: [動(dòng)態(tài)規(guī)劃]pku2411[未登錄]
              jiushiwo
              Posted @ 2007-10-12 09:11
              #include <iostream>
              long long f[12][2048], n, m;
              void dfs(int i, int j, int jj, int s)
              {
              if (s == m)
              f[i + 1][jj] += f[i][j];
              else if ((jj & (1 << s)) == 0)
              {
              dfs(i, j, jj | (1 << s), s + 1);
              if (s < m - 1 && (jj & (1 << (s + 1))) == 0) dfs(i, j, jj, s + 2);
              }
              else
              dfs(i, j, jj & ~(1 << s), s + 1); //為什么上一層是1,下一層直接置0呢?為什么不考慮置1的情況?
              }
              int main()
              {
              while (scanf("%d%d", &n, &m), n + m != 0)
              {
              memset(f, 0, sizeof(f));
              f[0][0] = 1;
              for (int i = 0; i < n; i++)
              for (int j = 0; j < (1 << m); j++)
              if (f[i][j])
              dfs(i, j, j, 0);
              printf("%I64d\n", f[n][0]);
              }
              return 0;
              }  回復(fù)  更多評(píng)論   
            • # re: [動(dòng)態(tài)規(guī)劃]pku2411
              Felicia
              Posted @ 2007-10-12 17:35
              @jiushiwo
              1表示已經(jīng)放了,不能放了,0表示還能放。  回復(fù)  更多評(píng)論   
            • # re: [動(dòng)態(tài)規(guī)劃]pku2411
              zlone
              Posted @ 2007-11-05 22:51
              如何理解橫放與豎放與不放3種狀態(tài)的2進(jìn)制表示呢
              想了一晚上試了好多方法不見效,奢望指點(diǎn)一二  回復(fù)  更多評(píng)論   
            • # re: [動(dòng)態(tài)規(guī)劃]pku2411
              Felicia
              Posted @ 2007-11-06 13:46
              @zlone
              畫個(gè)圖想想,不要考慮怎么放,要考慮放后的形狀  回復(fù)  更多評(píng)論   
            • # re: [動(dòng)態(tài)規(guī)劃]pku2411
              loveacm
              Posted @ 2007-12-03 17:08
              小弟愚笨,請(qǐng)問jj代表什么意思  回復(fù)  更多評(píng)論   
            • # re: [動(dòng)態(tài)規(guī)劃]pku2411
              Felicia
              Posted @ 2007-12-03 17:51
              j是初始狀態(tài),jj是目標(biāo)狀態(tài)  回復(fù)  更多評(píng)論   
            • # re: [動(dòng)態(tài)規(guī)劃]pku2411
              loveacm
              Posted @ 2007-12-03 18:15
              謝謝,另外,請(qǐng)問第k位上為1表示凸出一個(gè)格子,為0表示不凸出的方案數(shù),這個(gè)凸出如何理解?您的1并不表示豎放,0并不表示橫放吧?  回復(fù)  更多評(píng)論   
             
            国产精品久久久亚洲| 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 久久精品国产亚洲一区二区| 久久精品九九亚洲精品天堂| 久久精品国产精品亜洲毛片| 伊人久久大香线蕉综合影院首页| 久久久久综合网久久| 久久综合亚洲鲁鲁五月天| 成人妇女免费播放久久久| 久久人人爽人爽人人爽av| 无码日韩人妻精品久久蜜桃| 九九99精品久久久久久| 亚洲欧美国产日韩综合久久| 久久国产热精品波多野结衣AV| 免费观看成人久久网免费观看| 少妇人妻综合久久中文字幕| 久久免费精品一区二区| 婷婷伊人久久大香线蕉AV | 无码人妻精品一区二区三区久久久| 久久精品视频网| 色欲av伊人久久大香线蕉影院| 久久影院午夜理论片无码 | 91精品久久久久久无码| 久久久久国产精品人妻| 97精品依人久久久大香线蕉97| 国产精品久久久久久久| 亚洲精品NV久久久久久久久久 | 久久精品18| 久久久久久久久久久久中文字幕 | 久久久久久久精品妇女99| 97热久久免费频精品99| 伊人色综合九久久天天蜜桃| 国产一区二区三区久久| 7777精品伊人久久久大香线蕉 | 色婷婷综合久久久久中文 | 国产成人无码精品久久久免费| 久久久久亚洲AV成人网人人网站 | 国产精品亚洲综合久久| 亚洲国产精品无码久久98| 久久国产欧美日韩精品免费| 91秦先生久久久久久久|