题目大意:中文
注释代码:
/*
* Problem ID : POJ 1088 滑雪
* Author : Lirx.t.Una
* Language : C++
* Run Time : 16 ms
* Run Memory : 172 KB
*/
#include <stdio.h>
//maximum width
//dp矩阵的最大宽度
#define MAXW 101
#define MAX(x,y) ( (x) > (y) ? (x) : (y) )
short h[MAXW][MAXW];//height[i][j]表示坐标为(i, j)的地点的海拔高度
//dp[i][j]表示以(i, j)为起点的路径的最大长度
//由于最大路径为100 × 100处于short范围内
short dp[MAXW][MAXW];
int
fdp( int i, int j, int r, int c ) {//dp fucntion
//用以求以(i, j)为起点的路径的最大长度
//r、c为整个二位平面的长宽
//由于动态规划范围是二维平面,因此确定每个点动态规划的方向
//因此这里采用记忆化搜索 + 递归来实现动态规划
if ( dp[i][j] )//如果已经计算过则直接返回值
return dp[i][j];
int max;//暂存四个方向中的最大值
int tmp;//临时变量
max = 0;//初始化
//由于只能向上下左右四个方向走
//因此dp[i][j]必定等于四个方向的最大dp + 1
if ( i > 1 && h[i][j] > h[i - 1][j] ) {//上
tmp = fdp( i - 1, j, r, c );
max = MAX( max, tmp );
}
if ( j > 1 && h[i][j] > h[i][j - 1] ) {//左
tmp = fdp( i, j - 1, r, c );
max = MAX( max, tmp );
}
if ( j < c && h[i][j] > h[i][j + 1] ) {//右
tmp = fdp( i, j + 1, r, c );
max = MAX( max, tmp );
}
if ( i < r && h[i][j] > h[i + 1][j] ) {//下
tmp = fdp( i + 1, j, r, c );
max = MAX( max, tmp );
}
return dp[i][j] = max + 1;//注意先记忆再返回!!
}
int
main() {
int r, c;
int i, j;
int tmp;
int ans;
scanf("%d%d", &r, &c);
for ( i = 1; i <= r; i++ )
for ( j = 1; j <= c; j++ )
scanf("%d", &h[i][j]);
for ( ans = -1, i = 1; i <= r; i++ )
for ( j = 1; j <= c; j++ ) {
tmp = fdp( i, j, r, c );
ans = MAX( ans, tmp );
}
printf("%d\n", ans);
return 0;
}
无注释代码:
#include <stdio.h>
#define MAXW 101
#define MAX(x,y) ( (x) > (y) ? (x) : (y) )
short h[MAXW][MAXW];
short dp[MAXW][MAXW];
int
fdp( int i, int j, int r, int c ) {
if ( dp[i][j] )
return dp[i][j];
int max;
int tmp;
max = 0;
if ( i > 1 && h[i][j] > h[i - 1][j] ) {
tmp = fdp( i - 1, j, r, c );
max = MAX( max, tmp );
}
if ( j > 1 && h[i][j] > h[i][j - 1] ) {
tmp = fdp( i, j - 1, r, c );
max = MAX( max, tmp );
}
if ( j < c && h[i][j] > h[i][j + 1] ) {
tmp = fdp( i, j + 1, r, c );
max = MAX( max, tmp );
}
if ( i < r && h[i][j] > h[i + 1][j] ) {
tmp = fdp( i + 1, j, r, c );
max = MAX( max, tmp );
}
return dp[i][j] = max + 1;
}
int
main() {
int r, c;
int i, j;
int tmp;
int ans;
scanf("%d%d", &r, &c);
for ( i = 1; i <= r; i++ )
for ( j = 1; j <= c; j++ )
scanf("%d", &h[i][j]);
for ( ans = -1, i = 1; i <= r; i++ )
for ( j = 1; j <= c; j++ ) {
tmp = fdp( i, j, r, c );
ans = MAX( ans, tmp );
}
printf("%d\n", ans);
return 0;
}