POJ 1088 滑雪 (记忆化搜索)
2016-04-20 11:10
435 查看
题目链接:http://poj.org/problem?id=1088
题意很好懂,就是让你求一个最长下降路线的长度。
dp[i][j]记录的是i j这个位置的最优的长度,然后转移方程是dp[i][j] = max(dp[i][j - 1], dp[i - 1][j], dp[i][j + 1], dp[i + 1][j]) + 1。
已知最低点的答案 慢慢倒推到高点的答案。(还是对记忆化搜不熟练啊)
题意很好懂,就是让你求一个最长下降路线的长度。
dp[i][j]记录的是i j这个位置的最优的长度,然后转移方程是dp[i][j] = max(dp[i][j - 1], dp[i - 1][j], dp[i][j + 1], dp[i + 1][j]) + 1。
已知最低点的答案 慢慢倒推到高点的答案。(还是对记忆化搜不熟练啊)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 105; int dp[MAXN][MAXN] , r , c , h[MAXN][MAXN] , cont; int tx[] = {-1 , 0 , 1 , 0} , ty[] = {0 , -1 , 0 , 1}; int dfs(int x , int y) { if(dp[x][y]) return dp[x][y]; for(int i = 0 ; i < 4 ; i++) { int xx = x + tx[i] , yy = y + ty[i]; if(xx < 1 || yy < 1 || xx > r || yy > c || h[xx][yy] >= h[x][y]) { continue; } dp[x][y] = max(dfs(xx , yy) , dp[x][y]); } return (++dp[x][y]); } int main() { while(~scanf("%d %d" , &r , &c)) { cont = 0; memset(dp , 0 , sizeof(dp)); for(int i = 1 ; i <= r ; i++) { for(int j = 1 ; j <= c ; j++) { scanf("%d" , &h[i][j]); } } for(int i = 1 ; i <= r ; i++) { for(int j = 1 ; j <= c ; j++) { cont = max(cont , dfs(i , j)); } } printf("%d\n" , cont); } }
相关文章推荐
- 数据库连接参数解释
- reactor/proactor模型简介
- Linux 源码安装mysql
- java系统高并发解决方案(转载)
- WebMagic爬虫框架及javaEE SSH框架将数据保存到数据库(二)
- js三大流程控制
- Bzoj 4515 线段树 SDOI2016 游戏 Game
- lucene4之后的近实时搜索实现
- React Native学习-CameraRoll
- 101. Symmetric Tree -- 判断树结构是否对称
- XML封装与验证消息
- MHX护石修改汇集
- Android视频播放之MediaPlayer
- sizeof 的用法(初学者)
- Android Support Design Library 之 TabLayout
- 剑指offer 二叉搜索树的后序遍历序列
- 软件安装
- 空类编译器会自动生成哪些函数
- JS实时弹出新消息提示框并有提示音响起的实现代码
- Android 进程间通信(AIDL)