POJ1088滑雪(记忆化搜索)
2016-03-03 17:51
429 查看
就是用DP,DP[i][j]是在这个(i,j)位置作为起点的最长长度。
因为可能会超时,DP的话每次就是记录,然后就不用回溯了。
很简单的DFS里面的记忆化搜索。
因为可能会超时,DP的话每次就是记录,然后就不用回溯了。
很简单的DFS里面的记忆化搜索。
#include <stdio.h> #include <iostream> #include <string.h> #include <math.h> #include <stdlib.h> #include <queue> #include <set> #include <stack> #include <algorithm> using namespace std; #define PI acos(-1.0) #define INF 0x7fffffff #define N 110 int n,m; int dp ; int a ; int dx[4]={0,0,-1,1}; int dy[4]={1,-1,0,0}; int dfs(int i,int j) { if(dp[i][j]) return dp[i][j]; int tep=0; for(int k=0;k<4;k++) { int aa=dx[k]+i; int bb=dy[k]+j; if(aa>=0&&bb>=0&&aa<n&&bb<m&&a[i][j]>a[aa][bb]) { tep=max(tep,dfs(aa,bb)); } } return dp[i][j]=tep+1; } int main() { while(~scanf("%d%d",&n,&m)) { memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%d",&a[i][j]); } } int ans=0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { dp[i][j]=dfs(i,j); } } ans=0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { ans=max(dp[i][j],ans); } } printf("%d\n",ans); } return 0; }
相关文章推荐
- 超完整!Android获取图片的三种方法
- 图片三级缓存及OOM--android
- 使用Jersey创建RESTful风格的WebService
- UEFI 模式ghost win10
- 《编程精粹》书摘与读书笔记总结
- 在现场更新文件的流程------运维日志27
- 使用Entity Framework时要注意的一些性能问题
- JavaScript全讲-架构原则透析
- iOS之键盘处理
- 转自知乎 《Unicode 和 UTF-8 有何区别?》
- (16)集合操作
- mysql 日志
- linux如何开启oracle自动备份的脚本
- mysql root 忘记密码 破解
- 白话windows之 会话、工作站、桌面、窗口之间的关系
- 我是如何使用Android反编译软件的?
- iOS导航栏 修改系统返回按钮
- sizeof运算符来获取各种数据类型在内存中所占字节数--gyy整理
- PHP实现登录,注册,密码修改
- springmvc学习笔记(一)之简介