POJ1088動態規劃+遞迴解題報告

來源:互聯網
上載者:User

題目連結:摸我

 

看完題目會有一些比較直觀的想法,顯然是用DP,迭代公式也比較好想,f(i,j) = max{ f(i-1,j), f(i+1,j), f(i,j-1), f(i,j-1) } + 1

在上述公式中要注意的是若且唯若周圍的點比當前點小的時候才能列入計算的運算式中。

為了讓搜尋更為迅速,我給資料增加了邊界,並且由於採用了迭代的方式,對DP數組中的數值設定了Unprocessed和Processing兩個值,只有未處理的節點才會進行迭代計算。

廢話不多說,代碼如下:

 

//POJ1088滑雪(動態規劃之)<br />#include <iostream><br />using namespace std;<br />const int RANK = 102;<br />const int MaxHeight = 20000;<br />int maxRoad;<br />int DP[RANK][RANK];<br />int Data[RANK][RANK];<br />enum State{UnProcess = -2,Processing};<br />void Initialize(int r, int c)<br />{<br />//set boundary!<br />for (int i=0;i<=c+1;++i)<br />{<br />DP[i][0] = UnProcess;<br />DP[i][r+1] = UnProcess;<br />Data[i][0] = MaxHeight;<br />Data[i][r+1] = MaxHeight;<br />}<br />for (int i = 0;i<=r+1;++i)<br />{<br />DP[0][i] = UnProcess;<br />DP[c+1][i] = UnProcess;<br />Data[0][i] = MaxHeight;<br />Data[c+1][i] = MaxHeight;<br />}<br />for (int i = 1;i<=c;++i)<br />{<br />for (int j = 1;j<=r;++j)<br />{<br />cin>>Data[i][j];<br />DP[i][j] = UnProcess;<br />}<br />}<br />}<br />int CaculateOne(int x,int y)<br />{<br />int max = 0;<br />bool flag = false;<br />if(Data[x][y] > Data[x-1][y])//up<br />{<br />if(DP[x-1][y] == UnProcess)<br />DP[x-1][y] = CaculateOne(x-1,y);<br />if(max<DP[x-1][y])<br />max = DP[x-1][y];<br />flag = true;<br />}<br />if(Data[x][y] > Data[x+1][y])//down<br />{<br />if(DP[x+1][y] == UnProcess)<br />DP[x+1][y] = CaculateOne(x+1,y);<br />if(max<DP[x+1][y])<br />max = DP[x+1][y];<br />flag = true;<br />}<br />if(Data[x][y] > Data[x][y-1])//left<br />{<br />if(DP[x][y-1] == UnProcess)<br />DP[x][y-1] = CaculateOne(x,y-1);<br />if(max<DP[x][y-1])<br />max = DP[x][y-1];<br />flag = true;<br />}<br />if(Data[x][y] > Data[x][y+1])//right<br />{<br />if(DP[x][y+1] == UnProcess)<br />DP[x][y+1] = CaculateOne(x,y+1);<br />if(max<DP[x][y+1])<br />max = DP[x][y+1];<br />flag = true;<br />}<br />if(flag)<br />return max + 1;<br />else return 1;<br />}<br />int CalculateMaxRoad(int r, int c)<br />{<br />int max = 0;<br />for (int i = 1;i<=c;++i)<br />{<br />for (int j = 1;j<=r;++j)<br />{<br />if(DP[i][j] == UnProcess)<br />{<br />DP[i][j] = Processing;<br />DP[i][j] = CaculateOne(i,j);<br />}<br />if(DP[i][j]>max)<br />max = DP[i][j];<br />}<br />}<br />return max;<br />}<br />int main()<br />{<br />int r,c;<br />while(cin>>c>>r)<br />{<br /> Initialize(r,c);<br /> cout<<CalculateMaxRoad(r,c)<<endl;<br />}<br />return 0;<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.