动态规划学习——机器人运动

//一共有N个位置,机器人从start开始,走K步到end
//机器人到1后只能向2运动,到N后只能向N-1运动,即不能越界,只能在1-N的位置运动
//求总的路线的个数
//例:
//N=4,startp=1,endp=3,K=4
//则路线如下:
//1->2->3->4->3
//1->2->3->2->3
//1->2->1->2->3
//总共有3条路线#include<iostream>
using namespace std;
int N,K,startp,endp;
int ways2_temp[10000][10000]={0};
int ways3_temp[10000][10000]={0};void ways2_initial()
{int i,j;for(i=0;i<N+1;i++)for(j=0;j<K+1;j++)ways2_temp[i][j]=-1;
}void ways3_initial()
{int i,j;for(i=0;i<N+1;i++)for(j=0;j<K+1;j++)ways3_temp[i][j]=0;
}//法一:递归
//N为位置数,rest为剩余步数,cur为当前位置,endp为目标位置
int process1(int N,int rest,int cur,int endp)
{if(rest==0) return cur==endp?1:0;  //rest等于0时应该返回,此时应检查cur是否等于endp,若相等,则返回1(这条路可以走),否则返回0(此路不通)if(cur==1) return process1(N,rest-1,2,endp);//若cur=1,则路线数等于cur=2,rest=rest-1时的路线数if(cur==N) return process1(N,rest-1,N-1,endp);//若cur=N,则路线数等于cur=N-1,rest=rest-1时的路线数//如果cur不等于1,也不等于N,即在中间位置,则下一步既可以向左走,又可以向右走,所以等于左右步数相加else return process1(N,rest-1,cur+1,endp)+process1(N,rest-1,cur-1,endp);
}//法二:带有缓存的解决办法
//首先判断是否已经缓存了(cur,rest)的值(即路线数),若有则直接返回
//若没有则开始递推,且在返回结果前将结果保存到缓存数组中
int process2(int N,int rest,int cur,int endp)
{if(ways2_temp[cur][rest]!=-1) return ways2_temp[cur][rest];int cnt=0;if(rest==0) cnt=(cur==endp?1:0);  //rest等于0时应该返回,此时应检查cur是否等于endp,若相等,则返回1(这条路可以走),否则返回0(此路不通)else if(cur==1) cnt=process2(N,rest-1,2,endp);//若cur=1,则路线数等于cur=2,rest=rest-1时的路线数else if(cur==N) cnt=process2(N,rest-1,N-1,endp);//若cur=N,则路线数等于cur=N-1,rest=rest-1时的路线数//如果cur不等于1,也不等于N,即在中间位置,则下一步既可以向左走,又可以向右走,所以等于左右步数相加else cnt=process2(N,rest-1,cur+1,endp)+process2(N,rest-1,cur-1,endp);ways2_temp[cur][rest]=cnt;return cnt;
}//法三:动态规划
//由前面的方法可知,可以构建一个数组,行数为N,列数为K+1,第i行第j列的数值表示当前位置为i剩余步数为j时的路线总数
//而对于二维数组中每个值,都等于左上和右下值之和(第一行只有右下,最后一行只有左上)
//此外,对于第一列,即剩余步数rest=0时,只有当行数等于目标位置endp时,值为1
//故可以从左到右扫描数列,填充二维数组,最后的结果为第endp行第K列的值
int process3(int N,int K,int startp,int endp)
{int i,j;for(i=0;i<=K;i++) ways3_temp[i][0]=0;ways3_temp[endp][0]=1;for(i=1;i<=K;i++){ways3_temp[1][i]=ways3_temp[2][i-1];for(j=1;j<=N;j++){ways3_temp[j][i]=ways3_temp[j-1][i-1]+ways3_temp[j+1][i-1];}ways3_temp[N][i]=ways3_temp[N-1][i-1];}return ways3_temp[startp][K];
}int main()
{int choice;do{cout<<"请输入位置总数N:   ";cin>>N;cout<<"请输入开始位置startp:   ";cin>>startp;cout<<"请输入结束位置endp:   ";cin>>endp;cout<<"请输入一共要走的步数K:   ";cin>>K;int result1=process1(N,K,startp,endp);cout<<"法一 直接递归 得出 一共有 "<<result1<<" 种走法"<<endl;ways2_initial();int result2=process2(N,K,startp,endp);cout<<"法二 缓存递归 得出 一共有 "<<result2<<" 种走法"<<endl;ways3_initial();int result3=process3(N,K,startp,endp);cout<<"法三 动态规划 得出 一共有 "<<result3<<" 种走法"<<endl;cout<<"是否继续?继续输入1"<<endl;cin>>choice;}while(choice==1);return 0;
}

参考资料:

bilibili 马士兵教育——左程云

【应B友要求火速上线!算法大神(左程云)教你从暴力递归到动态规划,吊打所有暴力递归、动态规划问题】https://www.bilibili.com/video/BV1ET4y1U7T6?p=13&vd_source=4e9b7dd8105df854ae96830c97920252

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode的AC指南 —— 栈与队列:232.用栈实现队列

摘要&#xff1a; **Leetcode的AC指南 —— 栈与队列&#xff1a;232.用栈实现队列 **。题目介绍&#xff1a;请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a;…

列表列添加千分位保留两位小数

// 千分位无小数部分 function setThousandsMarkNoDecimal(num) {// console.log(num????, num, typeof num)if (!num) return num;let fu false;if (num.toString().includes(-)) {fu true;num Number(num.toString().substr(1));}// num Math.trunc(num); // 保留整数…

【Spring 篇】MyBatis注解开发:编写你的数据乐章

欢迎来到MyBatis的音乐殿堂&#xff01;在这个充满节奏和韵律的舞台上&#xff0c;注解是我们编写数据乐章的得力助手。无需繁琐的XML配置&#xff0c;通过简单而强大的注解&#xff0c;你将能够轻松地与数据库交互。在这篇博客中&#xff0c;我们将深入探讨MyBatis注解开发的精…

华为OD机试 - 智能驾驶(Java JS Python C)

题目描述 有一辆汽车需要从 m * n 的地图左上角(起点)开往地图的右下角(终点),去往每一个地区都需要消耗一定的油量,加油站可进行加油。 请你计算汽车确保从从起点到达终点时所需的最少初始油量。 说明: 智能汽车可以上下左右四个方向移动地图上的数字取值是 0 或 -1 …

NLP自然语言处理实战

一、自然语言处理的概念 1.1 自然语言处理的起源 语言是人类社会发展过程的产物&#xff0c;是最能体现人类智慧和文明的证明&#xff0c;也是人类与动物最大的区别。它是一种人与人交流的载体&#xff0c;像计算机网络一样&#xff0c;我们使用语言相互传递知识。在人类历史…

潜水泵如何实现远程状态监测与预测性维护?

在各行各业&#xff0c;潜水泵的健康数据采集一直是一项具有挑战性的任务。然而&#xff0c;一项被称为电气特征分析&#xff08;ESA&#xff09;的技术通过在电机控制柜而非泵本身上安装传感器&#xff0c;成功解决了这一问题。 图.泵&#xff08;iStock&#xff09; 一、电气…

Docker部署Golang服务

不管是开发还是生产环境&#xff0c;通过 docker 方式部署服务都是一种不错的选择&#xff0c;能够解决不同开发环境一致性的问题。 本文以项目&#xff1a;https://github.com/johncxf/go_practice 为例。 Dockerfile 构建 Go 运用环境 在项目根目录下添加 Dockerfile 文件…

Ubuntu重设root的密码

重设root的密码 未重设密码之前&#xff0c;Ubuntu 中默认的 root 密码是随机的&#xff0c;即每次开机都会有一个新的root 密码&#xff0c;所以此时的 root 用户密码并不确定&#xff1b; 重设root 密码&#xff0c;使用安装时创建的用户登录后sudo su切换至root用户&#…

云服务器搭建coturn出现Not reachable?

文章目录 问题复现解决方案1. 云服务器端口开放问题2. 检查配置文件3. 浏览器 问题解决 问题复现 使用云服务器搭建coturn服务时&#xff0c;出现not reachable报错 ICE Server配置是正确的 但测试relay时却报错&#xff1a;not reachable? 并且服务器也没输出相应日志。 …

(2021|ICLR,扩散先验,VE-SDE,逼真和忠实的权衡)SDEdit:使用随机微分方程引导图像合成和编辑

SDEdit: Guided Image Synthesis and Editing with Stochastic Differential Equations 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 背景&#xff1a;使用随机微分方程…

vue3-生命周期

生命周期 生命周期 vue 组件实例都有自己的一个生命周期 从创建->初始化数据->编译模版->挂载实例到 DOM->数据变更后更新 DOM ->卸载组件 生命周期简单说就是 vue 实例从创建到销毁的过程 生命周期钩子 在各个周期运行时&#xff0c;会执行钩子函数&…

vue 函数化组件

Vue.js提供了一个functional的布尔值选项&#xff0c;设置为true可以使组件无状态和无实例&#xff0c;也就是没有data和this上下文。这样用render函数返回虚拟节点可以更容易渲染&#xff0c;因为函数化组件只是一个函数&#xff0c;渲染开销要小很多。 使用函数化组件时&…

文件改名大师,随机大小写字母混合,让你的文件名独一无二!

文件重命名&#xff0c;单调又乏味&#xff1f;现在&#xff0c;有了我们的文件改名大师&#xff0c;让你的文件名充满惊喜与创意&#xff01;厌倦了那些毫无新意的文件名&#xff1f;我们为你提供了一种全新的方式&#xff0c;将文件名随机改名为大小写字母混合&#xff0c;让…

C语言实战系列一:经典贪食蛇

C语言学习必须实战&#xff0c;并且学完语法后就必须立即用实战来巩固。一般需要10来个比较复杂的程序才能掌握C语言。今天就教大家第一个小程序&#xff0c;贪食蛇。 首先上代码 一、代码 #include <stdio.h> #include <stdlib.h> #include <curses.h> #…

Springboot自动装配:三个注解、Selector、spring.factories文件、@ConditionalOnProperty注解

借鉴&#xff1a; 这个链接是包含run方法进来debug看整个过程的&#xff0c;建议先看&#xff1a;https://www.cnblogs.com/starsray/p/15580915.html https://blog.csdn.net/fengxiandada/article/details/130080828 Springboot自动装配 1.创建springboot应用 如何创建一个s…

Double 4 VR智能互动教学系统:创新酒店管理专业课堂教学

一、Double 4 VR智能互动教学系统的特点 1、高度仿真&#xff1a;VR技术可以模拟真实的工作环境&#xff0c;让学生身临其境地体验酒店管理的工作流程。 2、互动性强&#xff1a;通过VR设备&#xff0c;学生可以与虚拟环境中的角色进行互动&#xff0c;增强学习的趣味性和参与…

【版面稀缺】社科类3区SCI,稳定检索78年!着急毕业可投!

关注公主号【SciencePub学术】&#xff0c;发现期刊更多精彩~ 本期&#xff0c;小编给大家推荐的是一本SAGE旗下3区综合性期刊&#xff0c;均2-3个月左右录用&#xff01; 01 期刊基本信息 【期刊简介】IF&#xff1a;2.0-2.5&#xff0c;JCR3区&#xff0c;中科院4区&#x…

《WebKit 技术内幕》之八(2):硬件加速机制

2 Chromium的硬件加速机制 2.1 GraphicsLayer的支持 GraphicsLayer对象是对一个渲染后端存储中某一层的抽象&#xff0c;同众多其他WebKit所定义的抽象类一样&#xff0c;在WebKit移植中&#xff0c;它还需要具体的实现类来支持该类所要提供的功能。为了完成这一功能&#x…

【活动回顾】ABeam德硕| 艾宾信息技术开发(上海)宣讲会及企业座谈—山西大学专场

近日&#xff0c;ABeam大中华区董事长兼总经理中野洋辅先生带领艾宾上海招聘团队一行来到山西大学举行了校园招聘宣讲会&#xff0c;随后与院领导就校企合作事宜进行了深入的座谈交流。 宣讲会上&#xff0c;中野先生介绍了ABeam Consulting总社及ABeam中国的发展历程、业务版…

PIG框架学习3——Redisson 实现业务接口幂等

零、前言 ​ 业务接口幂等问题是在开发中遇到的&#xff0c;如果对业务接口代码不进行幂等控制&#xff0c;并且在前端没有对请求进行限制的情况下&#xff0c;可能会出现多次对接口调用&#xff0c;导致错误异常的发生。就上述情况&#xff0c;对PIGX自带的业务接口幂等实现进…