博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU1078
阅读量:4968 次
发布时间:2019-06-12

本文共 1243 字,大约阅读时间需要 4 分钟。

题意
给一个n×n的矩阵,老鼠从(1,1)出发
老鼠每次最多走k步停下来,停下的这个位置只能比上一个停留的位置大,并获取其价值,每次只能水平或垂直走,问从(0,0)出发最大能得到的价值
分析
错误思路:dp[i][j], 以dp[i][j]结尾的最大价值,这样状态不好转移
正解:直接根据题意
定义:dp[i][j] : 从(i,j)出发的可以获得的最大价值,直接找到从(i,j)出发可以到达的最大价值
转移:根据题意直接转移即可
#include 
#define ll long longusing namespace std;const int maxn = 1e5 + 10;\ int xxx[4]={-1,1,0,0}; int yyy[4]={
0,0,-1,1};int n,k;int dp[105][105];int a[105][105];int dfs(int x,int y){ if(dp[x][y]>0) return dp[x][y]; dp[x][y] = a[x][y]; for(int i = 1; i <= k; i++) { for(int j = 0; j < 4; j++) { int xx = x + i*xxx[j]; int yy = y + i*yyy[j]; if(xx>=1 && xx<=n && yy>=1 && yy<=n && a[xx][yy] > a[x][y]) { dp[x][y]=max(dp[x][y], dfs(xx,yy)+a[x][y]); } } } return dp[x][y];}int main(){ while(scanf("%d%d", &n, &k)!=EOF) { if(n==-1) break; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { scanf("%d", &a[i][j]); } } memset(dp,0,sizeof(dp)); dfs(1,1); printf("%d\n", dp[1][1]); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/Superwalker/p/7941198.html

你可能感兴趣的文章
Vue组件开发实践之scopedSlot的传递
查看>>
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
查看>>
加强树状数组luogu3368
查看>>
hdu4719 Oh My Holy FFF 线段树优化dp
查看>>
python处理excel文件(xls和xlsx)
查看>>
SPOJ TRAFFICN - Traffic Network
查看>>
(面试)写出下面switch语句的输出结果
查看>>
计算机中的“透明”
查看>>
haproxy报错解决
查看>>
nginx反向代理本地 单台wed -使用域名代理
查看>>
CSS
查看>>
eclipse 项目svn忽略不需要提交的文件
查看>>
蘑菇街电面
查看>>
angularjs SyntaxError: Unexpected token  in JSON at position 0
查看>>
C#读写共享文件夹
查看>>
Activity系列博客5篇
查看>>
JAVA通过HTTP方式获取数据
查看>>
dbda封装类(包括:返回二维数组、Ajax调用返回字符串、Ajax调用返回JSON)
查看>>
ADO.NET事务处理
查看>>
mvc html.beginform action值不正确的问题
查看>>