poj_1088_滑雪
2012-10-25 17:28
246 查看
经典dp问题/记忆化搜索 状态:rst[x][y] 表示从坐标x,y开始获得的最大长度 状态转移方程:rst[x][y] = max(rst[xi][yi])+1; 其中xi,yi为达到x,y的合法坐标 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define DIR 4 #define MAXROW 101 #define MAXCOL 101 int row, col; int dir[][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; int map[MAXROW][MAXCOL], rst[MAXROW][MAXCOL]; int depth_frist_serach(const int &x, const int &y) { int ans(0), tx, ty; for(int i = 0; i < DIR; i ++) { tx = x+dir[i][0]; ty = y+dir[i][1]; if( tx < 0 || ty < 0 || tx >= row || ty >= col || map[tx][ty] >= map[x][y]) { continue; } rst[tx][ty] = (-1 == rst[tx][ty])? depth_frist_serach(tx, ty) : rst[tx][ty]; ans = max(ans, rst[tx][ty]); } return ans+1; } int main(int argc, char const *argv[]) { #ifndef ONLINE_JUDGE freopen("test.in", "r", stdin); #endif int ans; while( ~scanf("%d %d", &row, &col) ) { for(int i = 0; i < row; i ++) { for(int j = 0; j < col; j ++) { scanf("%d", &map[i][j]); } } memset(rst, -1, sizeof(rst)); ans = 0; for(int i = 0; i < row; i ++) { for(int j = 0; j < col; j ++) { rst[i][j] = (-1 == rst[i][j])? depth_frist_serach(i, j) : rst[i][j]; ans = max(ans, rst[i][j]); } } printf("%d\n", ans); } return 0; }
相关文章推荐
- Poj 1088 滑雪 (简单DP + 记忆化搜索)
- POJ 1088 滑雪(记忆化搜索)
- poj 1088 滑雪(DFS+记忆化搜索)
- POJ-1088 滑雪 (dfs + 线性dp)
- 滑雪 POJ - 1088
- poj 1088滑雪(记忆化搜索)
- POJ 1088 滑雪 记忆化搜索
- poj 1088 滑雪
- POJ-1088 滑雪 (记忆化搜索,dp)
- POJ 1088 滑雪 ( DFS+动态规划思想 )
- POJ 1088 滑雪
- POJ 1088-滑雪(记忆化搜索)
- POJ 1088 滑雪(经典二维动态规划)【模板】
- poj 1088 滑雪 简单的记忆化搜索/dp
- 动态规划 POJ 1088 滑雪
- POJ - 1088 滑雪 DP+记忆化搜索
- poj 1088 滑雪 DP
- poj 1088 滑雪 动态规划
- 【DP】POJ 1088 滑雪
- POJ 1088 滑雪