• <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>
            心如止水
            Je n'ai pas le temps
            posts - 400,comments - 130,trackbacks - 0

            傳紙條是一道典型的多進程動態規劃題,四維狀態的狀態定義很容易想到,具體定義如下:d[i1,j1,i2,j2]表示第一次從起點走到(i1,j1)這個點,第二次從起點走到(i2,j2)這個點所獲得的最大值。狀態轉移方程也很容易寫出:

            d[i1,j1,i2,j2]=max(d[i1-1,j1,i2-1,j2],d[i1-1,j1,i2,j2-1],d[i1,j1-1,i2-1,j2],d[i1,j1-1,i2,j2-1])+a[i1,j1]+a[i2,j2];if i1=i2 and j1=j2 then d[i1,j1,i2,j2]=d[i1,j1,i2,j2]-a[i1,j1];

            關于這一點在本空間的博客中已經提到。

            但是這樣的狀態定義卻重復計算了許多子問題。遞推需要四層循環,前兩層是固定了第一次的終點,然后開始推第二次的終點;試想第一次走到(i,j)這個點,遞推完成,下次遞推第一次走到(i,j+1)這個點的情況,即將第二次走到的位置從(1,1)推到(m,n)。直觀地去想,這樣做是不是多出了許多運算?或者是沒有充分利用重疊子問題?

            發現對于一個m,n的矩陣,共有m+n-1條對角線,而每次走下一步,都是從一條對角線,走到下一條對角線。于是有了一個另外一個狀態定義:d[i,j,k]表示在第i條對角線上,第一次走到行坐標為j的位置,第二次走到行坐標為k的位置。這樣的定義就避免了重復計算,因為在第i條對角線的情況只取決于第i-1條對角線的情況,不需要從頭開始重新計算,可以想象一下這樣定義的程序執行過程。而且可以用滾動數組優化空間,最終只需要d[2,51,51]的空間就足夠了!和之前d[51,51,51,51]的空間復雜度好太多了。在時間上也是一個極大的優化,最終全部數據加在一起會在0.2s內解決,之前需要1.9s左右。

             

            以下是我的代碼:

            #include<stdio.h>
            #define max(a,b) (a>b?a:b)
            long m,n,a[51][51],d[2][51][51]={0};
            long begin(long x)
            {
                
            if(x>=1&&x<=n) return 1;
                
            if(x>n&&x<=n+m-1return x-n+1;
            }

            long end(long x)
            {
                
            return (x<m?x:m);
            }

            int main()
            {
                freopen(
            "message.in","r",stdin);
                freopen(
            "message.ans","w",stdout);
                
            long i,j,k;
                scanf(
            "%ld%ld",&m,&n);
                
            for(i=1;i<=m;i++)
                  
            for(j=1;j<=n;j++)
                    scanf(
            "%ld",&a[i][j]);
                
            for(i=1;i<=n+m-1;i++)
                  
            for(j=begin(i);j<=end(i);j++)
                    
            for(k=begin(i);k<=end(i);k++)
                    
            {
                       d[i
            %2][j][k]=max(d[(i-1)%2][j][k],d[(i-1)%2][j-1][k]);
                       d[i
            %2][j][k]=max(d[i%2][j][k],d[(i-1)%2][j][k-1]);
                       d[i
            %2][j][k]=max(d[i%2][j][k],d[(i-1)%2][j-1][k-1]);
                       d[i
            %2][j][k]+=a[j][i-j+1]+a[k][i-k+1];
                       
            if(j==k)
                         d[i
            %2][j][k]-=a[j][i-j+1];
                    }

                printf(
            "%ld\n",d[(n+m-1)%2][m][m]);
            return 0;
            }

            posted on 2010-01-06 20:31 lee1r 閱讀(336) 評論(0)  編輯 收藏 引用 所屬分類: 題目分類:動態規劃
            午夜肉伦伦影院久久精品免费看国产一区二区三区 | 久久夜色精品国产噜噜噜亚洲AV| 超级97碰碰碰碰久久久久最新| 97精品依人久久久大香线蕉97| 久久久久久久人妻无码中文字幕爆 | 久久99精品久久久久久hb无码 | 免费精品久久久久久中文字幕| 97久久婷婷五月综合色d啪蜜芽| 久久精品九九亚洲精品天堂| 亚洲国产成人精品91久久久 | 久久亚洲中文字幕精品一区四| 日韩精品无码久久久久久| 亚洲嫩草影院久久精品| 亚洲精品乱码久久久久66| 久久久久亚洲AV无码专区网站 | 亚洲精品乱码久久久久66| 久久黄视频| 久久国产精品99精品国产987| 狠狠色丁香久久婷婷综合_中| 久久国产精品99精品国产987| 亚洲AV日韩精品久久久久| 伊人热热久久原色播放www| 伊人久久大香线蕉精品| 粉嫩小泬无遮挡久久久久久| 亚洲午夜精品久久久久久app| 久久久久亚洲av成人无码电影 | yellow中文字幕久久网| 国产成人久久AV免费| 久久久久亚洲av无码专区导航| 久久久亚洲AV波多野结衣| 中文字幕久久久久人妻| 国产日韩欧美久久| 久久亚洲精品国产精品| 亚洲色大成网站WWW久久九九| 亚洲国产高清精品线久久 | 久久中文精品无码中文字幕| 青青青国产精品国产精品久久久久| 国内精品久久人妻互换| 国产91色综合久久免费分享| 久久久久国产一级毛片高清版| 青青草国产成人久久91网|