HDU 1078 FatMouse and Cheese 记忆化搜索DP
2015-12-04 17:19
323 查看
直接爆搜肯定超时,除非你加了某种凡人不能想出来的剪枝...555
因为老鼠的路径上的点满足是递增的,所以满足一定的拓补关系,可以利用动态规划求解
但是复杂的拓补关系无法简单的用循环实现,所以直接采取记忆化搜索的方式进行DP,成功避免重叠子问题,避免超时
View Code
因为老鼠的路径上的点满足是递增的,所以满足一定的拓补关系,可以利用动态规划求解
但是复杂的拓补关系无法简单的用循环实现,所以直接采取记忆化搜索的方式进行DP,成功避免重叠子问题,避免超时
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #include<cstring> #include<cstring> #include<vector> #include<queue> #include<stack> using namespace std; int dp[105][105]; int a[105][105]; int n,k; int dx[4]= {0,0,1,-1}; int dy[4]= {-1,1,0,0}; int dfs(int x,int y) { int maxc=0; if(!dp[x][y]) { for(int i=0; i<4; ++i) { for(int j=1; j<=k; j++) { int p=x+dx[i]*j; int q=y+dy[i]*j; if(p<0||p>=n||q<0||q>=n)break; if(a[p][q]<=a[x][y])continue; maxc=max(maxc,dfs(p,q)); } } dp[x][y]=a[x][y]+maxc; } return dp[x][y]; } int main() { while(~scanf("%d%d",&n,&k)) { if(n==k&&n==-1) break; memset(dp,0,sizeof(dp)); for(int i=0; i<n; i++) for(int j=0; j<n; j++) scanf("%d",&a[i][j]); printf("%d\n",dfs(0,0)); } return 0; }
View Code
相关文章推荐
- button设置边宽和圆角
- HDU - 1879 继续畅通工程(最小生成树)
- 数据库oracle 11g 监控管理
- Windows中的system函数
- 如何写简历
- 在日期选择轮中选择的时间转换成年龄
- 字符串与数组互转
- 使用ASI传递post表单..参数是数组
- c语言解析
- 断点续传
- 第十四周实践项目1--验证折半查找
- Java NIO ByteBuffer图解
- Treap学习基本入门
- Leetcode180: Majority Element II
- StarUML使用说明-指导手册
- 通过dSYM和app文件分析Crash
- pat甲 1078 Hashing
- 在WPF中获取程序的专用工作集内存 PerformanceCounter
- 模糊测试相关文章
- DPDK编程指导——编写高效代码(翻译)