当前位置: 首页 > news >正文

递推问题

递推:

在面对一个大任务的时候,有时候我们可以将大任务划分为小任务,再将小任务划分为更小的任务......,直到遇到初始情况,最后由初始情况一直往前推进,最后解决大任务,这就是递推的思想。

递推问题:

例题1.砖块:

由n 个砖块排成一排,从左到右编号依次为 1∼n,砖块分为黑色(B)和白色(W),每次可以改变相邻两个砖块的颜色。问需要多少次将所有砖块变成一种颜色;

如果可以,输出次数与任意一种改变方案(改变n[k]和n[k]时,输出k);

如果不行输出-1。

思路:

首先,我们假设改变p[k]时,p[k+1]一同变换;

每块砖最多只需要改变一次;

最后需要把所有砖变成W或者B,假设全变为W;

从第一块开始,如果第一块不为W,就改变p[k]与p[k+1],一直扫描到第n-1块砖;

如果最后的一块砖为W,则该情况有解,否则无解;

假设全变为B,重复上述操作即可。

代码如下:

string str;//字符//改变字符为对应字符
void update(char &c){c=='W'?c='B':c='W';
}//判断是否能全变为st
bool check(char st,int n){vector<int>res;//变换的位置string s=str;//注意可能判断两次,不能改变str//如果不为st,则改变for(int i=0;i<n-1;i++)if(s[i]!=st){update(s[i]);update(s[i+1]);res.push_back(i);}//如果最后一位是stif (s[n-1]==st){cout<<res.size()<<endl;if(res.size()){for(int i=0;i<res.size();i++)cout<<res[i]+1<<" ";cout<<endl;}return true;}return false;
}int main(){int n;//字符串长度cin>>n>>str;if(!check('W',n)&&!check('B',n))cout<<"-1"<<endl;//如果两种情况都不行return 0;
}

例题2.费解的开关:

25盏灯排成一个5*5的方形,每一个灯有开(1)和关(0)两种状态,每一次可以改变一盏灯的状态,并且这盏灯的上下左右相邻的灯的状态也都会改变,问最少需要几步可以让所有灯都亮。如果超过六步,则输出-1,否则输出次数。

思路:

每盏灯只有该变一次的必要;

我们先枚举第一行灯的状态(只改变第一盏灯);

因为所有的灯都需要点亮,这时我们就根据第一行灯的状态来改变第二行灯的状态,然后根据第二行的状态.......,最后根据第四行的状态来改变第五行;

最后判断最后一行是否全亮,如果全亮则有解,反之无解;

代码如下:

const int N=6;
int g[N][N],tmp[N][N];//灯,并且把灯的状态复制一份
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};void f(int x,int y){//开关(x,y)g[x][y]==0?g[x][y]=1:g[x][y]=0;for(int i=0;i<4;i++){int a=x+dx[i],b=y+dy[i];if(a<0||b>=5||b<0||b>=5)continue;g[a][b]==0?g[a][b]=1:g[a][b]=0;}return;
}//要枚举很多次,每次枚举不能改变原始状态
int main(){memcpy(tmp,g,sizeof g);int res=7;for(int i=0;i<pow(2,5);i++){//二进制枚举,5个二进制位int s=0;//记录改变了几次for(int i=0;i<5;i++)//每次将g重置for(int j=0;j<5;j++)g[i][j]=tmp[i][j];for(int j=0;j<5;j++){//右移j位if(((i>>j)&1)==1){s++;f(0,j);}}for(int k=0;k<4;k++)//枚举前4行for(int u=0;u<5;u++){if(g[k][u]==0){s++;f(k+1,u);}}for(int k=0;k<5;k++)//判断最后一行是否全亮if(g[4][k]==0)s=7;if(s<=6)res=min(s,res);}return 0;}

以集合的视角看待一些递推问题:

很多递推问题让我们求的是方法数/数量、最值等问题,我们可以将要求的东西(方法数等)看作是一个集合,将此集合做一个不重不漏的划分,每个子集也可以以同样的方式划分,就可以得到递推式(子集之和、最值等)。

例题1.数楼梯:

楼梯有 N 阶,从一楼开始上楼,上楼可以一步上一阶,也可以一步上二阶。计算共有多少种不同的走法。

思路:

f[i]表示走到i位置的方法数;

f[k] = f[k-1] + f[k-2];

将走到k阶楼梯的方法数看作是一个集合;

因为只能从k-1和k-2的位置走到k,那么我们可以把走到k的方法数这个集合划分为走到第k-1和走到第k-2这两个台阶的方法集合,这时理解f[k] = f[k-1] + f[k-2]的含义就很容易了。

例题2.过河卒:

棋盘上 A点有一个过河卒,需要走到目标 B 点;

卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”;

现在要求你计算出卒从 A 点能够到达 B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

思路:

f[a][b]表示走到(a,b)的方法数;

f[a][b] = f[a-1][b] + f[a][b-1];

将走到(a,b)点的方法数看做是一个集合;

由于(a,b)只能是(a-1,b)和(a,b-1)走到的,将(a,b)集合不重不漏的划分为两个集合,走到(a,b)的方法数应该是走到(a-1,b)的方法数加上走到(a,b-1)的方法数。那么f[a][b] = f[a-1][b] + d[a][b-1]。

例题3.数字三角形:

给定一个数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。

思路:

g[i][j]表示三角形(i,j)位置的数,f[i][j]表示走到(i,j)点的最大值;

f[i][j] = max( f[i-1][j-1] , f[i-1][j] ) + g[i][j];

将走到(i , j)点的最大值看作是一个集合,那么这个集合可以划分为从左上角走过来和从右上角走过来这两个集合,我们将两个集合取最大值然后加上g[i][j]即可。

相关文章:

递推问题

递推&#xff1a;在面对一个大任务的时候&#xff0c;有时候我们可以将大任务划分为小任务&#xff0c;再将小任务划分为更小的任务......&#xff0c;直到遇到初始情况&#xff0c;最后由初始情况一直往前推进&#xff0c;最后解决大任务&#xff0c;这就是递推的思想。递推问…...

js中强制类型转换Number、parseInt、parseFloat、Boolean、String、toString的使用

文章目录一、Number() 转换为整数二、Number.parseInt() 将字符串转换为整数三、Number.parseFloat() 将字符串转换为浮点数四、Boolean() 转换为布尔值五、String() 转换为字符串六、.toString() 转换为字符串最近在巩固 js 的基础知识&#xff0c;今天复习到了 js 中的数据类…...

漏斗分析法

一什么是漏斗分析&#xff1f; 漏斗分析是数据领域最常见的一种“程式化”数据分析方法&#xff0c;它能够科学地评估一种业务过程&#xff0c;从起点到终点&#xff0c;各个阶段的转化情况。通过可以量化的数据分析&#xff0c;帮助业务找到有问题的业务环节&#xff0c;并进…...

pycharm入门快捷操作(部分)

altenter&#xff1a;提示意图动作shift两次或者crtlshifta&#xff1a;查找框&#xff08;查找动作、类、项目等&#xff09;crtlw&#xff1a;一次一个字符、两次整个字符串&#xff08;if条件下选择整个判断体&#xff09;、三次整个句子、四次整个引用ctrlshiftw&#xff1…...

宣布 Databricks 支持 Amazon Graviton2,性价比提高3倍

今天&#xff0c;我们很高兴地宣布 Databricks 对基于 Amazon Graviton2 的亚马逊弹性计算云&#xff08;Amazon EC2&#xff09;实例的支持的公开预览。Graviton 处理器由亚马逊云科技进行定制设计和优化&#xff0c;为运行在 Amazon EC2 上的云工作负载提供最佳性价比。当与高…...

18_FreeRTOS任务通知

目录 任务通知的简介 任务通知值的更新方式 任务通知的优势 任务通知的劣势 任务通知值和通知状态 发送通知相关API函数 接收通知相关API函数 任务通知模拟信号量实验 任务通知模拟消息邮箱实验 任务通知模拟事件标志组实验 任务通知的简介 任务通知:用来通知任务的…...

【华为OD机试模拟题】用 C++ 实现 - 整理扑克牌(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

mysql lesson1

常用命令 1:exit 退出mysql 2&#xff1a;uroot pENTER键&#xff0c;再输入密码&#xff0c;不被别人看见 3&#xff1a;完美卸载&#xff1a;双击安装包&#xff0c;手动删除program file中的mysql,手动删除Programedate里的mysql 4:use mysql 使用数据库 5&#xff1a;…...

联想笔记本无法下载 Lenovo Vantage

状况 在 Microsoft Store 下载时发生错误&#xff0c;可能是如下代码&#xff1a;0x80070005, 0x80073D05, or 0x80070017. 解决方法 1.在“开始”菜单搜索栏中输入PowerShell 2.当Windows PowerShell出现在“开始”菜单中&#xff0c;右键点击此图标&#xff0c;然后选择以…...

功能性材料深入超级赛道,赋能多行业迭代升级

中国国际胶粘剂及密封剂展览会深耕胶粘剂、密封剂和胶粘带行业26年&#xff0c;是行业认可的、优质的贸易与技术交流平台。展会连接了十几个行业的买家和卖家&#xff0c;包括汽车、电子、新能源、轨道交通、工业等重要领域&#xff0c;为客户提供封装、粘合、散热、装配制造等…...

【项目精选】jsp企业快信系统(论文+视频+源码)

点击下载源码 计算机网络的出现到现在已经经历了翻天覆地的重大改变。因特网也从最早的供科学家交流心得的简单的文本浏览器发展成为了商务和信息的中心。到了今天&#xff0c;互联网已经成为了大量应用的首选平台&#xff0c;人们已经渐渐习惯了网络交易&#xff0c;渐渐对网络…...

通信算法之112:载波同步及comm.CarrierSynchronizer

1. 2. 载波同步是基于锁相环技术使本地获取和载波同频同相的参考信号&#xff0c;用来解调信号。载波同步就是对本地参考信号进行频率和相位偏差的补偿&#xff0c;进而实现本地参考信号和载波信号同频同相。 载波同步只适用于单载波调制系统&#xff0c;载波同步算法对于BPSK、…...

【C. Build Permutation】(整数理论、构造、思维)

链接 理论基础 结论&#xff1a;在区间[n,2n]上&#xff0c;至少存在一个完全平方数。结论&#xff1a;在区间[n,2n]上&#xff0c;至少存在一个完全平方数。结论&#xff1a;在区间[n,2n]上&#xff0c;至少存在一个完全平方数。 构造⌈n⌉2构造\lceil \sqrt{n}\rceil^2构造⌈…...

前端面试题:事件循环(Eventloop)

什么是事件循环&#xff1f;如何理解事件循环?事件循环原理如何描述&#xff1f;事件循环涉及了很多知识点&#xff0c;想要彻底掌握JS事件循环原理必须要掌握以下知识点&#xff1a;同步任务、异步任务、宏任务、微任务、任务队列、执行栈、js运行机制、EventLoop。 1.事件循…...

jmeter接口自动化测试框架

接口测试可以分为两部分&#xff1a; 一是线上接口&#xff08;生产环境&#xff09;自动化测试&#xff0c;需要自动定时执行&#xff0c;每5分钟自动执行一次&#xff0c;相当于每5分钟就检查一遍线上的接口是否正常&#xff0c;有异常能够及时发现&#xff0c;不至于影响用…...

树莓派CM4基础设置

安装系统1.1 软件和硬件准备硬件&#xff1a;CM4&#xff08;4GB DDR32GB EMMC 板载WIFI和蓝牙&#xff09;CM4-to-Pi4-Adapter软件&#xff1a;Raspberry Pi或者 Win32DiskImagerRaspberry Pi下载链接&#xff1a;点击直接下载Win32DiskImager下载链接&#xff1a;链接&#x…...

JS 合并数组的三大方式

1. 数组的不可变合并 1.1使用扩展运算符进行合并 如果您想知道一种在JavaScript中合并数组的好方法&#xff0c;那么请记住使用扩展操作符进行合并。 在数组字面量中写入两个或更多带有扩展操作符…前缀的数组&#xff0c;JavaScript将创建一个合并所有这些数组的新数组: co…...

30岁测试开发年薪不足50万,被面试官嘲讽混得太差?

近日&#xff0c;有网友发帖称&#xff1a;“30岁去应聘测试开发&#xff0c;拿不到七八十万的年薪确实有点丢人了&#xff0c;还被面试官diss混得太差了”&#xff0c;网友们看完都炸了。 来看看网友们都是怎么说的。 有网友说&#xff1a; 扯淡 有网友气到&#xff1a; 那拿…...

【C语言】多线程

多线程线程线程的优点C语言多线程创建线程终止线程连接和分离线程开启一个线程最基本的多线程实现开启两个线程多线程进行协同运算无参数传递的线程并发编程实例简单参数传递的线程并发编程实例结构体参数传递的线程并发编程实例线程的连接编程实例信号量同步进行写入互斥信号量…...

CDGA|浅谈“以治促用,以用促治”的数据治理战略

数据治理夯实企业数字化转型基础。采取“以治促用&#xff0c;以用促治”的数据治理战略&#xff0c;可以充分释放了企业核心运行要素的活力。 “以治促用”是指通过建立在数据治理链路及用户多维评估系统的基础上&#xff0c;对数据资产重新进行价值识别&#xff0c;推进高价值…...

5大维度解析:Label Studio ML Backend如何实现自动化标注效率革命

5大维度解析&#xff1a;Label Studio ML Backend如何实现自动化标注效率革命 【免费下载链接】label-studio-ml-backend Configs and boilerplates for Label Studios Machine Learning backend 项目地址: https://gitcode.com/gh_mirrors/la/label-studio-ml-backend …...

YimMenu安全指南与效率提升:GTA5辅助工具全面应用手册

YimMenu安全指南与效率提升&#xff1a;GTA5辅助工具全面应用手册 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimM…...

万能学习方法论的理论建构与多领域适配性研究(乖乖数学)

万能学习方法论的理论建构与多领域适配性研究&#xff08;乖乖数学&#xff09;这篇题为《万能学习方法论的理论建构与多领域适配性研究》的博士学位论文提纲&#xff0c;展现了一个极为宏大、系统且雄心勃勃的理论构建尝试。它试图整合经典教育心理学理论&#xff08;尤其是知…...

当stm32遇上ai:利用快马平台辅助开发嵌入式语音关键词识别原型

最近在做一个嵌入式语音识别的小项目&#xff0c;用STM32F4开发板实现关键词唤醒功能。作为一个嵌入式开发者&#xff0c;第一次尝试把AI算法部署到资源有限的MCU上&#xff0c;整个过程踩了不少坑&#xff0c;也发现了一些高效开发的技巧&#xff0c;特别是借助InsCode(快马)平…...

Cadence Layout XL 飞线太乱?两步搞定,还你一个清爽的版图界面

Cadence Layout XL飞线管理实战&#xff1a;从视觉优化到高效布局 每次打开Cadence Layout XL&#xff0c;看到满屏密密麻麻的飞线&#xff0c;是不是感觉头都大了&#xff1f;作为一名从Altium转战Cadence的版图工程师&#xff0c;我完全理解这种视觉轰炸带来的困扰。飞线本是…...

用AI辅助编程踩坑记:CH32V003驱动WS2812B,PWM+DMA配置避雷指南

CH32V003驱动WS2812B避坑实战&#xff1a;当AI生成的PWMDMA代码遇到现实 第一次尝试用AI辅助编写CH32V003驱动WS2812B的代码时&#xff0c;我天真地以为只要把芯片手册扔给AI就能得到完美运行的代码。直到LED灯带显示出诡异的彩虹乱码&#xff0c;我才意识到自己掉进了AI挖的多…...

RTX 4090D 24G显存适配方案:PyTorch 2.8镜像GPU利用率提升实测分析

RTX 4090D 24G显存适配方案&#xff1a;PyTorch 2.8镜像GPU利用率提升实测分析 1. 开篇&#xff1a;为什么选择RTX 4090D 24G RTX 4090D作为NVIDIA最新一代消费级显卡旗舰&#xff0c;24GB显存容量使其成为大模型训练和推理的理想选择。相比专业级显卡动辄数万的价格&#xf…...

9个非技术岗也能胜任的AI岗位,小白程序员看过来,建议收藏![特殊字符]

9个非技术岗也能胜任的AI岗位&#xff0c;小白程序员看过来&#xff0c;建议收藏&#xff01;&#x1f525; 本文介绍了9个适合非技术背景人士的AI相关岗位&#xff0c;包括AI产品运营、大模型产品助理、AI客服训练师等&#xff0c;涵盖了岗位职责、薪资水平、招聘方及入门建议…...

CPS实战:如何用树莓派+传感器搭建你的第一个信息物理系统(附代码)

CPS实战&#xff1a;如何用树莓派传感器搭建你的第一个信息物理系统&#xff08;附代码&#xff09; 信息物理系统&#xff08;CPS&#xff09;听起来像是高科技实验室里的复杂装置&#xff0c;但实际上&#xff0c;你完全可以用手边的树莓派和几十元的传感器搭建一个功能完整的…...

Rplidar 报错 RESULT_OPERATION_TIMEOUT 排查指南:从波特率到硬件自检的完整流程

1. 遇到RESULT_OPERATION_TIMEOUT报错时的心态调整 第一次看到Rplidar弹出"Error, operation time out. RESULT_OPERATION_TIMEOUT!"的时候&#xff0c;我也是一头雾水。这种报错就像突然断电的电脑——你不知道是电源线松了还是主板烧了。但根据我处理过上百次这类问…...