poj 1088 滑雪
2011-06-18 17:56
316 查看
/* 解题报告: 1、不定起点和终点的DAG上DP 水题 2、可以考虑下怎样把路径输出来:见注释中求路径代码 注:该题为DAG上 DP不定终点起点的经典题 */ #include <iostream> #include <cstring> using namespace std; const int MAXN = 110; int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int g[MAXN][MAXN], dis[MAXN][MAXN]; int R, C; int dp(int r, int c) { int &ans = dis[r][c]; if(ans != 0) return ans; int temp = 0; for(int i=0; i<4; ++i) { if(r+dir[i][0]>=1 && r+dir[i][0]<=R && c+dir[i][1]>=1 && c+dir[i][1]<=C && g[r+dir[i][0]][c+dir[i][1]]<g[r][c]) { temp = dp(r+dir[i][0], c+dir[i][1]) + 1; } if(temp>ans) ans = temp; } return ans; } int main() { int i, j; while(cin>>R>>C) { for(i=1; i<=R; i++) for(j=1; j<=C; j++) cin>>g[i][j]; memset(dis, 0, sizeof(dis)); int nMax = 0; for(i=1; i<=R; ++i) { for(j=1; j<=C; ++j) { if(nMax < dp(i, j)) nMax = dp(i, j); } } cout<<(nMax+1)<<endl; } return 0; } //求路径 /* #include <iostream> #include <cstring> using namespace std; const int MAXN = 110; int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int g[MAXN][MAXN], dis[MAXN][MAXN]; int R, C; //方法二 用的数据结构 struct Route { int r; int c; Route() { r = 0; c = 0; } Route(int R, int C) { r = R; c = C; } }route[MAXN][MAXN]; int dp(int r, int c) { int &ans = dis[r][c]; if(ans != 0) return ans; int temp = 0; for(int i=0; i<4; ++i) { if(r+dir[i][0]>=1 && r+dir[i][0]<=R && c+dir[i][1]>=1 && c+dir[i][1]<=C && g[r+dir[i][0]][c+dir[i][1]]<g[r][c]) { temp = dp(r+dir[i][0], c+dir[i][1]) + 1; } if(temp>ans) { ans = temp; route[r][c] = Route(r+dir[i][0], c+dir[i][1]); } } return ans; } //方法一 void print_ans(int r, int c) { int i; cout<<"("<<r<<","<<c<<") "; for(i=0; i<4; ++i) { if(r+dir[i][0]>=1 && r+dir[i][0]<=R && c+dir[i][1]>=1 && c+dir[i][1]<=C && dis[r][c] == dis[r+dir[i][0]][c+dir[i][1]]+1) { print_ans(r+dir[i][0], c+dir[i][1]); break; } } } void print_ans2(int r, int c, int nMax) { while(nMax--) { cout<<"("<<r<<","<<c<<") "; r = route[r][c].r; c = route[r][c].c; } } int main() { int i, j; int iindex, jindex; while(cin>>R>>C) { for(i=1; i<=R; i++) for(j=1; j<=C; j++) cin>>g[i][j]; memset(dis, 0, sizeof(dis)); int nMax = 0; for(i=1; i<=R; ++i) { for(j=1; j<=C; ++j) { if(nMax < dp(i, j)) { nMax = dp(i, j); iindex = i; jindex = j; } } } cout<<(nMax+1)<<endl; print_ans(iindex, jindex); cout<<endl; print_ans2(iindex, jindex, nMax+1); } return 0; } */
相关文章推荐
- POJ 1088 滑雪【经典DP】
- POJ 1088 滑雪
- POJ 1088 滑雪(DP)
- POJ 1088滑雪的一种非记忆搜索的解法
- POJ 1088 Java:滑雪(动态规划)
- poj 1088 滑雪
- POJ 1088 滑雪 (记忆化搜索)
- POJ 1088 滑雪(dp)
- POJ 1088 滑雪
- poj 1088/洛谷 p1434 [SHOI2002]滑雪
- poj1088 滑雪问题 dp写法
- POJ 1088 滑雪 (经典DP)
- 滑雪_poj_1088(记忆化搜索).java
- POJ 1088 滑雪(dp动态规划)
- poj 百练1088滑雪路线问题 动态规划
- poj 1088 滑雪 (记忆化 Dp)
- nyoj10 poj 1088经典滑雪问题
- POJ 1088 滑雪 (记忆化搜索)
- POJ1088 滑雪
- POJ 1088 滑雪(递归+记忆化搜索)