hdu_p1078(记忆化搜索)
来源:互联网 发布:淘宝河北邢台羊绒衫 编辑:程序博客网 时间:2024/05/23 02:10
http://acm.hdu.edu.cn/showproblem.php?pid=1078
分析:题目的要求是要从(0,0)的位置开始到最后停止(不能像四个方向移动了)所吃到的cheese的量;
每次移动应该满足的条件:1. 现在的cheese量要比前一次的多 2. 一次可以移动多个(小于等于k)
在搜索过程中记录从该点出发能够吃到的cheese量
代码:
//hdu1078 fatmouse and cheese#include <iostream>#include <stdio.h>#include <string.h>using namespace std;int n,k;int vis[104][104],mark[104][104];int map[104][104],dp[104][104];int ndir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};int max(int a,int b){ return a>b ? a : b;}bool judge(int x,int y){return (x>=0)&&(x<n)&&(y>=0)&&(y<n)&&(!vis[x][y]);}void dfs(int a,int b){int x,y;mark[a][b]=1;vis[a][b]=1;for(int i=1;i<=k;i++){for(int j=0;j<4;j++){x=a+ndir[j][0]*i;y=b+ndir[j][1]*i;if(judge(x,y)&&map[x][y]>map[a][b]){if(mark[x][y])dp[a][b]=max(dp[a][b],map[a][b]+dp[x][y]);else{dfs(x,y);dp[a][b]=max(dp[a][b],map[a][b]+dp[x][y]);}} }}if(!dp[a][b]) dp[a][b]=map[a][b];vis[a][b]=0;}int main(){ while(scanf("%d%d",&n,&k)!=EOF){ if(n==-1&&k==-1) break; for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&map[i][j]); memset(dp,0,sizeof(dp)); memset(mark,0,sizeof(mark)); memset(vis,0,sizeof(vis)); mark[0][0]=1;dfs(0,0); printf("%d\n",dp[0][0]); }}
- hdu_p1078(记忆化搜索)
- WOJ(记忆化搜索)
- 滑雪 (记忆化搜索)
- hihocoder1037(记忆化搜索)
- hdu1078 (记忆化搜索)
- HDU3555Bomb(记忆化搜索)
- uva10626(记忆化搜索)
- *hdu1078(记忆化搜索)
- 滑雪(记忆化搜索)
- poj1088(记忆化搜索)
- hdu1069(*记忆化搜索)
- poj3186(记忆化搜索)
- uva1637(记忆化搜索)
- hdu5456(记忆化搜索)
- 记忆化搜索(搜索+dp思想)
- (sgu)Balloons(记忆化搜索)
- pku1088 滑雪(记忆化搜索)
- 记忆化递归搜索(poj 1579)
- 《UNIX环境高级编程》笔记--进程时间
- ulipad 无法安装使用、无法调试、64位版本问题 ImportError: No module named comtypes 整体解决方案!
- ATM模拟提款机
- Java基础知识部分汇总
- 给C++初学者的50个忠告
- hdu_p1078(记忆化搜索)
- 分享完整的项目工程目录结构
- linux shell编程指南第七章------正则表达式介绍
- 无线wifi密码的破解
- 结构体存储分配
- 将GMT时间字符串转换为DateTime类型
- 枚举算法(判断n是否能被3,5,7整除)
- 整(解)编
- JAVA基础知识精华总结