hdu 1078 FatMouse and Cheese(记忆搜)
2024-09-06 03:48:25
N*N的矩阵,每个格子上有一个值。
老鼠起始在(1,1),每次只能水平着走或垂直着走。且最多只能走K步。且走到的格子里的值必须比上一次呆的格子里的值大。
问老鼠最多收集到多少值。
思路:
记忆搜好写、方便。
注意边界
代码:
int n,k;
int a[105][105];
int dp[105][105]; int dfs(int x,int y){
if(dp[x][y]>0)
return dp[x][y];
for(int i=x+1;i<=min(n,x+k);++i){
if(a[i][y]>a[x][y]){
dp[x][y]=max( dp[x][y],dfs(i,y)+a[x][y] );
}
}
for(int i=x-1;i>=max(1,x-k);--i){
if(a[i][y]>a[x][y]){
dp[x][y]=max( dp[x][y],dfs(i,y)+a[x][y] );
}
}
for(int i=y+1;i<=min(n,y+k);++i){
if(a[x][i]>a[x][y]){
dp[x][y]=max( dp[x][y],dfs(x,i)+a[x][y] );
}
}
for(int i=y-1;i>=max(1,y-k);--i){
if(a[x][i]>a[x][y]){
dp[x][y]=max( dp[x][y],dfs(x,i)+a[x][y] );
}
}
if(dp[x][y]==0)
dp[x][y]=a[x][y];
return dp[x][y];
} int main(){ while(scanf("%d%d",&n,&k)!=EOF){
if(n==-1 && k==-1){
break;
}
rep(i,1,n){
rep(j,1,n){
scanf("%d",&a[i][j]);
}
}
mem(dp,0);
int ans=dfs(1,1);
printf("%d\n",ans);
} return 0;
}
最新文章
- 如何使用 App Studio 快速定制你自己的 Universal Windows App
- fedora 16安装ByPass四网口网卡遇到的问题
- 暴力求解——UVA 572(简单的dfs)
- HDU_2040——判断亲和数
- getpwuid()函数
- Java并发编程:Thread类的使用介绍
- Qt 智能指针学习(7种QT的特有指针)
- C++ 知识点总结复习
- iOS 动画篇 之 Core Animation (一)
- 浅谈-RMQ
- 获取键盘的ascii码
- 使用Kotlin优雅的开发Android应用
- redis安装使用配置
- Java基本数据类型-包装类
- postman优缺点
- 459. Repeated Substring Pattern 判断数组是否由重复单元构成
- Android基础笔记(十八)- Fragment
- Python抓取视频内容
- Linux下设置开机启动
- RTL Compiler之Technology Library