POJ 1088 滑雪 DP
2011-09-10 01:32
489 查看
题意: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更长。事实上,这是最长的一条。
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更长。事实上,这是最长的一条。
#include < iostream > using namespace std; #define N 102 int array , b ; int getMax( int i, int j ) { int temp, max; temp = max = 0; if ( b[i][j] != -1 ) return b[i][j]; else { if ( array[i][j] > array[i][j+1] ) { temp = getMax ( i, j+1 ); if ( temp > max ) max = temp; } if ( array[i][j] > array[i][j-1] ) { temp = getMax( i, j-1 ); if ( temp > max ) max = temp; } if ( array[i][j] > array[i+1][j] ) { temp = getMax ( i+1, j ); if ( temp > max ) max = temp; } if ( array[i][j] > array[i-1][j] ) { temp = getMax ( i-1, j ); if ( temp > max ) max = temp; } b[i][j] = max + 1; return b[i][j]; } } int main() { int i, j; for ( i = 0; i < N; i++ ) array[i][0] = array[0][i] = array[N-1][i] = array[i][N-1] = 10001; int r, c; cin >> r >> c; for ( i = 1; i <= r; i++ ) { for ( j = 1; j <= c; j++ ) { cin >> array[i][j]; b[i][j] = -1; } } int max = 0, temp; for ( i = 1; i <= r; i ++ ) { for ( j = 1; j <= c; j++ ) { temp = getMax(i,j); if ( temp > max ) max = temp; } } cout << max << endl; return 0; }
相关文章推荐
- poj 1088 滑雪(DP)
- POJ 1088 滑雪 (dp)
- DP::Poj1088 滑雪
- (DP6.1.4.2)POJ 1088 滑雪
- POJ-----1088---滑雪DP
- poj 1088 滑雪 dp
- POJ-1088 滑雪 (记忆化搜索,dp)
- 【DP】POJ 1088 滑雪
- POJ-1088 滑雪 (记忆化搜索,dp)
- poj 1088 滑雪(线性DP)
- poj 1088 滑雪 (记忆化 Dp)
- POJ 1088 滑雪 (DFS+DP)
- POJ 1088 滑雪(DP)
- POJ_1088 滑雪(记忆型DP+DFS)
- poj 1088 滑雪 DP
- Poj_1088_滑雪(DP)
- POJ 1088 滑雪(DP)
- POJ-1088 滑雪 dp
- POJ 1088 滑雪 DP
- POJ 1088 滑雪【经典DP】