动态规划 之 dp + 图搜索

本文介绍了一个使用动态规划和记忆化搜索解决的滑雪球问题。通过状态转移方程DP(i,j) = max(DP(i,j-1), DP(i,j+1), DP(i-1,j), DP(i+1,j)) + 1,找到最长滑雪路径。代码展示了如何在C++中实现这一算法,包括边界检查、记忆化搜索和结果输出。动态规划的关键在于理解问题并正确定义状态转移方程。" 80023068,7527218,Mock与MagicMock的区别与使用,"['python', '单元测试', 'mock']
摘要由CSDN通过智能技术生成
/*
// 典型的动态规划,用递归下的记忆化搜索来实现,得用递归,因为你根本不知道从哪里开始,即cnt[0][0]不知道是多少
// 状态转移方程 合法的情况下:DP(i,j) = max( DP(i,j-1), DP(i,j+1), DP(i-1,j), DP(i+1,j) ) + 1;
#include <iostream>
using namespace std;
const int m_size = 105;
int cnt[m_size][m_size],matrix[m_size][m_size];
int dir[4][2] = {
  {0,1},{0,-1},{1,0},{-1,0}};
int row,col;
bool ok(const int &x,const int &y)
{
    return (x>=0&&x<row && y>=0&&y<col);
}
// 如果已经处理过,直接返回(记忆化搜索效率之所以高的原因:不重复计算)
int dp(const int &x,const int &y)
{
    // 将结果记录在cnt数组中(记忆化搜索的重点)
	// 如果左右上下都没有一个点的值比这个点的值大,则cnt[i][j] = max+1 = 1
	// 否则将左右上下各点最大滑雪长度记录在max中, 则cnt[i][j] = max+1
	// 这就是max为什么要初始化为0的原因.
    int dx,dy,i;
    int max = 0;
    if(cnt[x][y]>0)
        return cnt[x][y];
    for(i=0;i<4;i++)
    {
        dx = x + dir[i][0];
        dy = y + dir[i][1];
        if(ok(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值