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;
}

最新文章

  1. 如何使用 App Studio 快速定制你自己的 Universal Windows App
  2. fedora 16安装ByPass四网口网卡遇到的问题
  3. 暴力求解——UVA 572(简单的dfs)
  4. HDU_2040——判断亲和数
  5. getpwuid()函数
  6. Java并发编程:Thread类的使用介绍
  7. Qt 智能指针学习(7种QT的特有指针)
  8. C++ 知识点总结复习
  9. iOS 动画篇 之 Core Animation (一)
  10. 浅谈-RMQ
  11. 获取键盘的ascii码
  12. 使用Kotlin优雅的开发Android应用
  13. redis安装使用配置
  14. Java基本数据类型-包装类
  15. postman优缺点
  16. 459. Repeated Substring Pattern 判断数组是否由重复单元构成
  17. Android基础笔记(十八)- Fragment
  18. Python抓取视频内容
  19. Linux下设置开机启动
  20. RTL Compiler之Technology Library

热门文章

  1. scrum项目冲刺_day02总结
  2. C++ windows 函数讲解(二)鼠标坐标
  3. appium日志
  4. FastAPI logger日志记录方案 loguru模块
  5. 『Python』面向对象(一)
  6. 定要过python二级 选择题第5套
  7. P1912-[NOI2009]诗人小G【四边形不等式,单调队列】
  8. CSS 小技巧 | 一行代码实现头像与国旗的融合
  9. css 弹性盒子--“垂直居中”--兼容写法
  10. BurpSuite 功能概览