博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
!HDU 1078 FatMouse and Cheese-dp-(记忆化搜索)
阅读量:5336 次
发布时间:2019-06-15

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

题意:有一个n*n的格子。每一个格子里有不同数量的食物,老鼠从(0,0)開始走。每次下一步仅仅能走到比当前格子食物多的格子。有水平和垂直四个方向,每一步最多走k格,求老鼠能吃到的最多的食物。

分析:

矩阵上求最大子路线和,可是不像一维的最大子序列那么easy,由于二维的确定不了计算顺序。

既然不能确定计算顺序,那么就能够利用dp记忆化搜索,这个正好不用管计算顺序;

dp记忆化搜索的思想:递归,然后通过记录状态dp[i][j]是否已经计算过来保证每一个状态仅仅计算一次避免反复计算。若计算过则返回dp[i][j],否则计算dp[i][j],直到全部状态都计算过。

大体框架是这种:

memset(dp,0,sizeof(dp));

int DP(int x,int y)

    if(dp[x][y]) return dp[x][y];

    计算dp[i][j];(这当中包含一些条件推断等)

}

递归函数怎么写是重点和难点,以后多注意积累和理解。

代码:

#include
#define max(a,b) a>b?a:busing namespace std;int d[4][2]={
{-1,0},{1,0},{0,-1},{0,1}};int n,k,a[200][200];int dp[200][200];int dfs(int x,int y){ if(!dp[x][y]){ int mx=0,sum; for(int i=1;i<=k;i++){ for(int j=0;j<4;j++){ int dx=x+d[j][0]*i; int dy=y+d[j][1]*i; if(dx>=0&&dx
=0&&dy
a[x][y]){ sum=dfs(dx,dy); mx=max(sum,mx); } } } dp[x][y]=a[x][y]+mx; } return dp[x][y];}int main(){ while(cin>>n>>k){ if(n==-1&&k==-1) break; for(int i=0;i
>a[i][j]; memset(dp,0,sizeof(dp)); int ans=dfs(0,0); cout<
<

转载于:https://www.cnblogs.com/gcczhongduan/p/5334183.html

你可能感兴趣的文章
面向对象
查看>>
lintcode83- Single Number II- midium
查看>>
移动端 响应式、自适应、适配 实现方法分析(和其他基础知识拓展)
查看>>
selenium-窗口切换
查看>>
使用vue的v-model自定义 checkbox组件
查看>>
[工具] Sublime Text 使用指南
查看>>
Hangfire在ASP.NET CORE中的简单实现方法
查看>>
Algorithm——何为算法?
查看>>
Web服务器的原理
查看>>
小强升职计读书笔记
查看>>
常用的107条Javascript
查看>>
#10015 灯泡(无向图连通性+二分)
查看>>
忘记root密码,怎么办
查看>>
linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】
查看>>
《黑客与画家》 读书笔记
查看>>
bzoj4407: 于神之怒加强版
查看>>
mysql统计一张表中条目个数的方法
查看>>
ArcGIS多面体(multipatch)解析——引
查看>>
css3渐变画斜线 demo
查看>>
JS性能DOM优化
查看>>