• <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
             

            背景 Background

            在很久很久以前,有一個動物村莊,那里是豬的樂園(^_^),村民們勤勞、勇敢、善良、團結……
              不過有一天,最小的小小豬生病了,而這種病是極其罕見的,因此大家都沒有儲存這種藥物。所以晴天小豬自告奮勇,要去采取這種藥草。于是,晴天小豬的傳奇故事便由此展開……

            描述 Description

            這一天,他來到了一座深山的山腳下,因為只有這座深山中的一位隱者才知道這種藥草的所在。但是上山的路錯綜復雜,由于小小豬的病情,晴天小豬想找一條需時最少的路到達山頂,但現在它一頭霧水,所以向你求助。
              山用一個三角形表示,從山頂依次向下有1段、2段、3段等山路,每一段用一個數字T1<=T<=100)表示,代表晴天小豬在這一段山路上需要爬的時間,每一次它都可以朝左、右、左上、右上四個方向走(**注意**:在任意一層的第一段也可以走到本層的最后一段或上一層的最后一段)。
              晴天小豬從山的左下角出發,目的地為山頂,即隱者的小屋。

            輸入格式 Input Format

            第一行有一個數n2<=n<=1000),表示山的高度。
              從第二行至第n+1行,第i+1行有i個數,每個數表示晴天小豬在這一段山路上需要爬的時間。

            輸出格式 Output Format

            一個數,即晴天小豬所需要的最短時間。

            樣例輸入 Sample Input

            5

            1

            2 3

            4 5 6

            10 1 7 8

            1 1 4 5 6

            樣例輸出 Sample Output

            10

            這題猛然一看像是IOI 94“數字三角形”,但仔細看上去比“數字三角形”復雜了許多。

            不同之處在于:

            1.       數字三角形中可以以第n行任意一個數字為起點,而Hill的起點在左下角;

            2.       數字三角形中只可以不停向上走,不可以同行之間走,而此題可以;

            3.       此題中可以從一行的一個端點直接繞到另一個端點(同行或上面一行)。

             

            類比數字三角形,寫出一個遞推式

            d[i][j]=max (d[i][j-1],d[i][j+1],d[i+1][j],d[i+1][j+1]);

            無疑這是一種錯誤的寫法,因為出現了環,對于動態規劃有了后效性。

             

            后效性的出現是因為可以同行之間走,但是不會走重復的點是可以肯定的,于是想到后效性是可以消除的。

            現在先考慮同行的情況。

            假設某一時刻走到了 (i,j) 這一點,在下一步決策的時候,要么是(i,j-1),要么是(i,j+1),先不考慮加減之后越界的情況。而如果選擇了(i,j-1)這個點,下一步再決策的時候,勢必不會再重復(i,j),而只會考慮(i,j-2)。狀態d[i][j]定義為從(n,1)到點(i,j)的最短距離大小,若d[i][j]來自同行某個數,只能來自d[i][j-1]d[i][j+1]其中一個。

            于是有了一個基本的思路:

            對于每一行來說先向右遞推,再向左遞推,遞推式為

            d[i][j]=min (d[i][j],d[i-1][j]+a[i][j])

            向左推的遞推式類似地可以寫出。

            每行左右遞推各一次即可,環的問題根本不需要擔心。d[i][j]必來自于左推和右推時更優的一條路,若將d[i][j][0]定義為表示右推的結果,d[i][j][1]表示左推的結果,則d[i][j]的最終值為min(d[i][j][0],d[i][j][1]),這樣可能更好理解一點,說明左右互不影響,只是從中選擇一個即可。

            循環進入上一行之后,開始遞推向上走的情況,和數字三角形遞推式一樣,不過邊緣需要單獨考慮,不再給出

            d[i][j]=min(d[i+1][j],d[i+1][j+1])+a[i][j]

             

            另外說出我在寫程序的時候遇到的一些情況,我要開200萬的long數組,寫在main()中,沒有成功,提示出錯,我不想用壓縮存儲,看某人的程序把數組定義為全局,我當時不知道為什么他要那么做,學著設為全局變量(如下),成功了~!在做noip2008第三題的時候也一樣,要開[51][51][51][51]的數組(當然后來知道可以降一維),開不了,改成全局變量,又成功了~


            以下是我的代碼:
            #include<stdio.h>
            #define maxint 2000000000
            #define min(a,b) (a<b?a:b)
            long a[1000][1000]={0};
            long d[1000][1000]={0};
            int main()
            {
                
            long n,i,j,k,tmp,x1,x2;
                scanf(
            "%ld",&n);
                
            for(i=0;i<n;i++)
                  
            for(j=0;j<=i;j++)
                    scanf(
            "%ld",&a[i][j]);//------Read In
                for(i=0;i<n;i++)
                  
            for(j=0;j<=i;j++)
                    d[i][j]
            =maxint;
                
            for(i=0;i<n;i++)
                  d[n
            -1][i]=a[n-1][i];
                
            for(i=1;i<n;i++)
                  d[n
            -1][i]=d[n-1][i-1]+a[n-1][i];
                
            for(i=n-1;i>=0;i--)
                  d[n
            -1][i]=min(d[n-1][i],d[n-1][(i+1)%n]+a[n-1][i]);
                
                
            for(i=n-2;i>=0;i--)
                
            {
                   d[i][
            0]=min(d[i+1][0],d[i+1][1]);
                   d[i][
            0]=min(d[i][0],d[i+1][i+1]);
                   d[i][
            0]+=a[i][0];
                   d[i][i]
            =min(d[i+1][0],d[i+1][i]);
                   d[i][i]
            =min(d[i][i],d[i+1][i+1]);
                   d[i][i]
            +=a[i][i];

                   
            for(j=1;j<=i-1;j++)
                     d[i][j]
            =min(d[i+1][j],d[i+1][j+1])+a[i][j];
                   d[i][
            0]=min(d[i][0],d[i][i]+a[i][0]);
                   
            for(j=1;j<=i;j++)
                     d[i][j]
            =min(d[i][j],d[i][j-1]+a[i][j]);
                   
            for(j=i;j>=0;j--)
                     d[i][j]
            =min(d[i][j],d[i][(j+1)%(i+1)]+a[i][j]);

                }

                printf(
            "%ld\n",d[0][0]);
            return 0;
            }

            posted on 2010-01-06 18:39 lee1r 閱讀(1371) 評論(0)  編輯 收藏 引用 所屬分類: 題目分類:動態規劃
            韩国免费A级毛片久久| 久久午夜无码鲁丝片秋霞| 国产综合久久久久久鬼色| 狠狠色婷婷久久综合频道日韩| 国产精品美女久久久m| 久久精品国产亚洲Aⅴ蜜臀色欲| 伊人色综合久久天天人守人婷 | 久久久久国产精品三级网| 青青草原综合久久大伊人导航| 亚洲精品蜜桃久久久久久| 欧美日韩中文字幕久久伊人| 99蜜桃臀久久久欧美精品网站| 国产精品久久久久9999高清| 一级做a爰片久久毛片看看| 亚洲国产精久久久久久久| 国产亚洲精品久久久久秋霞| 99久久99久久精品免费看蜜桃| 久久久久国产成人精品亚洲午夜| 狠狠色丁香婷综合久久| 99久久香蕉国产线看观香| 久久本道久久综合伊人| 精品久久久久久久久中文字幕| 久久狠狠爱亚洲综合影院| 欧美日韩精品久久久久| 国产成人久久精品麻豆一区| 国产精品久久久福利| 国内精品伊人久久久久av一坑 | 国产精品美女久久久久网| 国产精品成人久久久| 婷婷久久综合九色综合绿巨人| 久久se这里只有精品| 久久久久亚洲爆乳少妇无| 久久夜色tv网站| 精品久久久久久| 国产精品九九久久免费视频| 99久久精品九九亚洲精品| 草草久久久无码国产专区| 国产精品女同一区二区久久| 久久精品中文字幕第23页| 久久久久亚洲AV无码专区网站 | 亚洲中文字幕无码久久精品1 |