• <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>
            隨筆 - 87  文章 - 279  trackbacks - 0
            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            潛心看書研究!

            常用鏈接

            留言簿(19)

            隨筆分類(81)

            文章分類(89)

            相冊

            ACM OJ

            My friends

            搜索

            •  

            積分與排名

            • 積分 - 217833
            • 排名 - 117

            最新評論

            閱讀排行榜

            評論排行榜

            原題:

            滑雪
            Time Limit:1000MS  Memory Limit:65536K

            Description
            Michael喜歡滑雪百這并不奇怪, 因?yàn)榛┑拇_很刺激。可是為了獲得速度,滑的區(qū)域必須向下傾斜,而且當(dāng)你滑到坡底,你不得不再次走上坡或者等待升降機(jī)來載你。Michael想知道載一個區(qū)域中最長底滑坡。區(qū)域由一個二維數(shù)組給出。數(shù)組的每個數(shù)字代表點(diǎn)的高度。下面是一個例子

             1  2  3  4 5
            
            16 17 18 19 6
            15 24 25 20 7
            14 23 22 21 8
            13 12 11 10 9

            一個人可以從某個點(diǎn)滑向上下左右相鄰四個點(diǎn)之一,當(dāng)且僅當(dāng)高度減小。在上面的例子中,一條可滑行的滑坡為24-17-16-1。當(dāng)然25-24-23-...-3-2-1更長。事實(shí)上,這是最長的一條。

            Input
            輸入的第一行表示區(qū)域的行數(shù)R和列數(shù)C(1 <= R,C <= 100)。下面是R行,每行有C個整數(shù),代表高度h,0<=h<=10000。

            Output
            輸出最長區(qū)域的長度。

            我提交的程序:

            #include<iostream>
            using namespace std;

            const int MAX = 102;

            struct pos
            {
                
            int i,j,p;//i->行;j->列;p->來源方向
            };

            int path(int [MAX][MAX],int [MAX][MAX],int[][MAX],int,int);

            int main()
            {
                
            int input[MAX][MAX];
                
            int result[MAX][MAX];
                
            int status[MAX][MAX];
                
            int m,n;
                
            int i,j;
                
            int max,ans;
                cin
            >>m>>n;
                
            for (i = 0; i<=m+1; i++)
                    
            for (j = 0; j<=n+1; j++)
                    {
                        input[i][j] 
            = 10001;
                        result[i][j] 
            = 0;
                        status[i][j] 
            = 0;
                    }

                
            for (i = 1; i<=m; i++)
                    
            for (j = 1; j<=n; j++)
                    {
                        cin
            >>input[i][j];
                    }

                
            for (i = 1; i<=m; i++)
                    
            for (j = 1; j<=n; j++)
                        path(input,result,status,i,j);
                
                max 
            = 0;
                
            for (i = 1; i<=m; i++)
                    
            for (j = 1; j<=n; j++)
                        
            if (max<result[i][j])
                            max 
            = result[i][j];

                cout
            <<max<<endl;
                
            return 0;
            }

            int path(int input[MAX][MAX],int result[MAX][MAX],int status[MAX][MAX],int i,int j)
            {
                pos pack[MAX
            *MAX];
                
            int max,g,h;
                
            int ii;
                
            int top = 0;
                
            int p = 0;
                
            int incr[4][2= {{-1,0},{0,1},{1,0},{0,-1}};//增量表
                
                
            //初始化
                if (result[i][j]>0)
                {
                    
            return 0;
                }
                
            else 
                {
                    pack[top].i 
            = i;
                    pack[top].j 
            = j;        
                    pack[top].p 
            = p;
                    status[i][j] 
            = -1;    
                }

                
            while (top>=0||p<4)
                {
                    
            if (p<4)
                    {
                        g 
            = pack[top].i+incr[p][0];
                        h 
            = pack[top].j+incr[p][1];
                        
            //判斷是否合法
                        if (input[pack[top].i][pack[top].j]>input[g][h])
                        {
                           
            if (result[g][h]>0||status[g][h]==-1)//
                               p++;
                           
            else
                           {
                               
            //進(jìn)棧
                               top++;
                               pack[top].i 
            = g;
                               pack[top].j 
            = h;
                               pack[top].p 
            = p;
                               status[g][h] 
            = -1;
                               p 
            = 0;
                           }
                        }
            //合法
                        else
                        {
                            p
            ++;
                        }
                    }
                    
            else//p==4時
                    {
                        max 
            = 0;
                        
            for (ii = 0; ii<4; ii++)//四個方向
                        {
                            g 
            = pack[top].i+incr[ii][0];
                            h 
            = pack[top].j+incr[ii][1]; 
                            
            if (input[pack[top].i][pack[top].j]>input[g][h]&&max<result[g][h])
                                max 
            = result[g][h];
                        }
                        result[pack[top].i][pack[top].j] 
            = max+1;
                        top
            --;//回溯
                        p = pack[top].p+1;    
                    }
                }
                
            return 0;
            }
            此題用到了回溯,和動態(tài)規(guī)劃,也是經(jīng)典,推薦acmer做做.歡迎交流:)
            posted on 2006-03-01 21:50 閱讀(2200) 評論(3)  編輯 收藏 引用 所屬分類: C++之夢

            FeedBack:
            # re: 又是一題動態(tài)規(guī)劃--經(jīng)典 2006-03-11 23:44 
            這題關(guān)鍵是回溯時候,保留回溯點(diǎn)的最大步數(shù)  回復(fù)  更多評論
              
            # re: 又是一題動態(tài)規(guī)劃--經(jīng)典 2006-04-22 11:29 gogoplayer
            程序長了,競賽一共只有5小時
            用遞歸簡單些  回復(fù)  更多評論
              
            # re: 又是一題動態(tài)規(guī)劃--經(jīng)典 2006-06-23 16:11 巴澤爾
            的確程序有點(diǎn)長,但這到題直接用動態(tài)規(guī)劃就OK了

            #include <iostream>
            #include <fstream>
            #include <cstring>

            using namespace std;
            ifstream fin("snow.in");

            main()
            {int k,l,zong=0,max=0;
            fin>>k>>l;
            int data[101][101],site[101][101];
            int paix[10001],paiy[10001];
            memset(site,0,10000);
            for(int a=0;a<k;a++)for(int b=0;b<l;b++)fin>>data[a][b];

            while(zong!=k*l)
            { int i=0,zhi=10001;
            for(int a=0;a<k;a++){
            for(int b=0;b<l;b++){
            if(data[a][b]==zhi && site[a][b]==0){i++;paix[i]=a;paiy[i]=b;}

            if(data[a][b]<zhi && site[a][b]==0){i=0;paix[i]=a;paiy[i]=b;zhi=data[a][b];}
            }}
            for(int a=0;a<=i;a++){

            zong++;int zhi=0;
            if(paiy[a]-1>=0 && data[paix[a]][paiy[a]-1]<data[paix[a]][paiy[a]])
            if(site[paix[a]][paiy[a]-1]>zhi)zhi=site[paix[a]][paiy[a]-1];
            if(paiy[a]+1<l && data[paix[a]][paiy[a]+1]<data[paix[a]][paiy[a]])
            if(site[paix[a]][paiy[a]+1]>zhi)zhi=site[paix[a]][paiy[a]+1];
            if(paix[a]-1>=0 && data[paix[a]-1][paiy[a]]<data[paix[a]][paiy[a]])
            if(site[paix[a]-1][paiy[a]]>zhi)zhi=site[paix[a]-1][paiy[a]];
            if(paix[a]+1<k && data[paix[a]+1][paiy[a]]<data[paix[a]][paiy[a]])
            if(site[paix[a]+1][paiy[a]]>zhi)zhi=site[paix[a]+1][paiy[a]];
            site[paix[a]][paiy[a]]=zhi+1;
            if(zhi+1>max)max=zhi+1;

            }
            }
            cout<<max<<endl;
            cin.get();
            cin.get();
            }

            本人qq:309844427




              回復(fù)  更多評論
              
            国产麻豆精品久久一二三| 国产精品熟女福利久久AV| 99久久精品免费看国产免费| 无码AV波多野结衣久久| 人人妻久久人人澡人人爽人人精品| 99久久精品免费观看国产| 免费观看成人久久网免费观看| 人妻无码αv中文字幕久久琪琪布| 狠狠色婷婷久久一区二区| 久久久黄色大片| 人妻无码精品久久亚瑟影视| 99久久精品这里只有精品| www亚洲欲色成人久久精品| 久久最近最新中文字幕大全| 久久久国产精品福利免费 | 久久精品亚洲欧美日韩久久| 久久99国产精品久久久| 久久精品国产精品青草| 99久久人人爽亚洲精品美女| 久久国产三级无码一区二区| 午夜视频久久久久一区| 国内精品伊人久久久久妇| 97精品依人久久久大香线蕉97| 亚洲精品无码久久久久| 国产精品福利一区二区久久| 777久久精品一区二区三区无码| 国产精品免费久久| 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲综合久久综合激情久久| 久久精品国产精品亚洲人人| 亚洲国产日韩欧美综合久久| 欧洲精品久久久av无码电影| 青青青青久久精品国产| 欧美与黑人午夜性猛交久久久| 热99RE久久精品这里都是精品免费| 亚洲精品高清国产一线久久| 国产精品日韩深夜福利久久| 综合人妻久久一区二区精品| 精品久久久久久无码中文字幕 | 中文字幕一区二区三区久久网站| 无码国内精品久久人妻麻豆按摩|