用「動態規劃」解決最長滑雪道問題

2021-07-10 08:55:32 字數 1113 閱讀 4580

**:

題目大意:

給你乙個矩陣,當做滑雪場,矩陣的每個單元中的數代表高度,滑雪者只能從高的滑到低的地方,且方向只能是上,下,左和右,問滑雪者最長能滑幾個單元?

解題思路:

該題本質上就是求矩陣上的最長嚴格連續遞減(或遞增)序列,即序列中的元素不能相等,而且前後之間必須相鄰。該題屬於動態規劃問題,要用到遞迴。

已找遞減序列為例,設dp[i][j]表示第i,j點所構成的序列有多長,求這個值,只需要對其上,下,左和右四個方向進行比較就可以,設board表示題目給的矩陣,dfs( i , j )表示求第i,j個點構成的序列長度,則可以得到

若board[i][j] > board[i-1][j], 則dp[i][j] = dp[i-1][j] + 1, 而dp[i-1][j]可以用遞迴求出,則狀態轉移方程為:

dp[i][j] = dfs( i-1 , j ) + 1;

但是還不夠,要對board[i][j]四個方向都計算一遍,取最大的,所以使用

int dx[4] = ;

int dy[4] = ;

然後進行一次迴圈,取出最大的值賦給dp[i][j],所以最終的狀態轉移方程為:

temp = max( temp, dfs( i + dx[k], j + dy[k] ) + 1 );

**:cpp**  

#include 

#include 

#include 

#include 

using

namespace std;  

int dp[105][105], board[105][105];  

int dfs( int i, int j );  

int main()  

}  int ans = 0;  

for( int i = 1; i <= m; i++ )  

}  cout

<

}  return 0;  

}  int dx[4] = ;  

int dy[4] = ;  

int dfs( int i, int j )  

return (dp[i][j] = temp);  

}  

用動態規劃方法去解決最長回文問題(python)

首先把 貼上來鎮樓,然後慢慢講這個思路。從下面得到的思路,動態規劃的問題最主要的就是轉移方程與狀態方程的建立。思考 當字串從i到j處是回文,那麼從i 1 到j 1處也一定是回文,就這樣一直回溯 直到i j 設定為1,換成我自己的狀態方程就是當x y時,target i,j 1,其他的時候為0 然後轉...

動態規劃解決北大 ACM 1088 滑雪問題

poj1088 以前一直想搞acm,但一直沒怎麼動,沒技術苦逼研究僧還是找不到工作,所以決心搞acm,小夥伴們和我一起來學習吧。動態規劃第一題 北大acm 1088滑雪問題 問題描述 滑雪 time limit 1000ms memory limit 65536k total submissions...

動態規劃 POJ1088 滑雪問題

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