• <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年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            潛心看書研究!

            常用鏈接

            留言簿(19)

            隨筆分類(81)

            文章分類(89)

            相冊

            ACM OJ

            My friends

            搜索

            •  

            積分與排名

            • 積分 - 216468
            • 排名 - 117

            最新評論

            閱讀排行榜

            評論排行榜

            原題:

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

            Description
            Michael喜歡滑雪百這并不奇怪, 因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道載一個區域中最長底滑坡。區域由一個二維數組給出。數組的每個數字代表點的高度。下面是一個例子

             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

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

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

            Output
            輸出最長區域的長度。

            我提交的程序:

            #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
                           {
                               
            //進棧
                               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;
            }
            此題用到了回溯,和動態規劃,也是經典,推薦acmer做做.歡迎交流:)
            posted on 2006-03-01 21:50 閱讀(2192) 評論(3)  編輯 收藏 引用 所屬分類: C++之夢

            FeedBack:
            # re: 又是一題動態規劃--經典 2006-03-11 23:44 
            這題關鍵是回溯時候,保留回溯點的最大步數  回復  更多評論
              
            # re: 又是一題動態規劃--經典 2006-04-22 11:29 gogoplayer
            程序長了,競賽一共只有5小時
            用遞歸簡單些  回復  更多評論
              
            # re: 又是一題動態規劃--經典 2006-06-23 16:11 巴澤爾
            的確程序有點長,但這到題直接用動態規劃就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




              回復  更多評論
              
            99久久国语露脸精品国产| 91久久精品91久久性色| 久久久久97国产精华液好用吗| 国产综合精品久久亚洲| 久久精品国产亚洲AV香蕉| 欧美牲交A欧牲交aⅴ久久| 久久亚洲精品中文字幕三区| 国产农村妇女毛片精品久久| 亚洲精品97久久中文字幕无码| 久久精品国产AV一区二区三区| 996久久国产精品线观看| 精品久久久久一区二区三区| 久久综合偷偷噜噜噜色| 国产欧美久久久精品| 亚洲精品午夜国产va久久| 免费精品99久久国产综合精品 | 久久无码专区国产精品发布| 欧洲人妻丰满av无码久久不卡| 久久久无码精品午夜| 久久99精品久久久久久久久久| 91精品无码久久久久久五月天| 国产精品一区二区久久精品涩爱| 999久久久国产精品| 久久精品国产亚洲av影院| 久久人与动人物a级毛片| 久久国产乱子伦精品免费午夜| 精品无码久久久久久尤物| 热99RE久久精品这里都是精品免费| 2021国产成人精品久久| 精品国产一区二区三区久久久狼| 伊人久久大香线蕉av不卡| 少妇被又大又粗又爽毛片久久黑人| 国产亚洲欧美成人久久片| 无码人妻久久久一区二区三区| 日韩久久无码免费毛片软件| 91亚洲国产成人久久精品网址| 99久久成人国产精品免费| 97精品久久天干天天天按摩| 久久av无码专区亚洲av桃花岛| 欧洲人妻丰满av无码久久不卡| 香蕉久久夜色精品升级完成|