递推算法C++

所谓递推,是指从已知的初始条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果。其中初始条件或是问题本身已经给定,或是通过对问题的分析与化简后确定。
从已知条件出发逐步推到问题结果,此种方法叫顺推。
从问题出发逐步推到已知条件,此种方法叫逆推。
无论顺推还是逆推,其关键是要找到递推式。这种处理问题的方法能使复杂运算化为若干步重复的简单运算,充分发挥出计算机擅长于重复处理的特点。

算法特点:

  • 1.问题可以划分成多个状态;
    2.除初始状态外,其它各个状态都可以用固定的递推关系式来表示。
    在我们实际解题中,题目不会直接给出递推关系式,而是需要通过分析各种状态,找出递推关系式。

例题1:树塔问题

描述:

树塔问题,编写程序计算从顶到底的某处的一条路径,使该路径所途径的数字最大

#include<bits/stdc++.h>
using namespace std;
int main() {int n, a[101][101];cin >> n;int sum =0;for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++) {cin >> a[i][j];}
}for (int i = n; i >= 1; i--) {int max = a[i][1];for (int j = 1; j <= i; j++) {if (a[i][j] > max) {max = a[i][j];}}sum += max;}cout << sum << endl;return 0;
}

例题2:斐波那契数列第N项

#include<bits/stdc++.h>
using namespace std;
int main() {int f0 = 1, f1 = 1, f2,n;cin >> n;for (int i = 3; i <= n; i++) {af2 = f1 + f0;f0 = f1;f1 = f2;}cout << f2;return 0;
}

例题3:昆虫繁殖

描述

科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过x个月产卵),问过z个月以后,共有成虫多少对?0≤x≤20,1≤y≤20,X≤z≤50

#include <iostream>
using namespace std;
#include <cstdio>
int a[25], b[25];
void fun(int x,int y,int z)
{a[1] = 1; b[1] = 0;for (int i = 1; i <= x; i++){a[i] = 1;b[i] = 0;}for (int i = x + 1; i <= z+1; i++) {:a[i] = a[i - 1] + b[i - 2];b[i] = a[i - x] * y;    }cout << a[z+1];
}
int main()
{int x, y, z;cin >> x >> y >> z;fun(x,y,z);
}

例题4:位数问题

描述

在所有的 N 位数中,有多少个数中有偶数个数字 3?由于结果可能很大,你只需要输出这个答案对 12345 取余的值。

#include<bits/stdc++.h>
using namespace std;
bool is_even(int a) {int count = 0;while (a != 0) {int ge = a % 10;if (ge == 3) { count++; }a /= 10;}if (count % 2 == 0) {return true;}else {return false;}
}
int main() {int n;cin >> n;int count = 0;for (int i = pow(10,n-1); i <= pow(10, n) - 1; i++) {if (is_even(i)) {count++;}}cout << count % 12345 << endl;return 0;
}

五种递推问题:

·Fibonacci数列

·Hanoi塔问题

·平面分割问题

·Catalan数

·第二类Stirling数


习题:

1.上台阶

楼梯有n(71>n>0)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶,编程计算共有多少种不同的走法。

#include<cstdio>  
long long d[100]= {0};  
int main()
{  d[1]=1;d[2]=2;d[3]=4;  for(int i=4; i<=100; i++)d[i]=d[i-1]+d[i-2]+d[i-3];  int a;  while(scanf("%d",&a)==1&&a)   printf("%lld\n",d[a]);  return 0;  
}  

2.流感传染

有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。

第一行一个数字n,n不超过100,表示有n*n的宿舍房间。

接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。

接下来的一行是一个整数m,m不超过100。

#include<bits/stdc++.h>
using namespace std;
char a[101][101]
int main() {int n,day,count=0;cin >> n;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cin >> a[i][j];}}cin >> day;for (int i = 2; i <= day; i++) {for (int j = 1; j <= n; j++) {for (int k = 1; k <= n; k++) {if (a[j][k] == '@') {if (a[j][k + 1] == '.') {a[j][k + 1] = '!';}if (a[j][k -1] == '.') {a[j][k -1] = '!';}if (a[j+1][k] == '.') {a[j+1][k] = '!';}if (a[j-1][k] == '.') {a[j-1][k] = '!';}}}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (a[i][j] == '!') {a[i][j] = '@';}}}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cout << a[i][j] << " ";}cout << endl;}cout << endl;}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (a[i][j] == '@') {count++;}}}cout << endl;cout << count;return 0;
}

*3.山区建小学

政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往。已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0<i<m。为了提高山区的文化素质,政府又决定从m个村中选择n个村建小学(设0<n≤m<500)。请根据给定的m、n以及所有相邻村庄的距离,选择在哪些村庄建小学,才使得所有村到最近小学的距离总和最小,计算最小值。

第1行为m和n,其间用空格间隔

第2行为m−1个整数,依次表示从一端到另一端的相邻村庄的距离,整数之间以空格间隔。

#include<bits/stdc++.h>
using namespace std;
int dis[100][100], dp[100][100], d[100];
//dis两村庄中建立一所学校的最小距离
//d村庄到原点的距离
//dp最小距离
int cal(int x, int y) {int mid = (x + y) / 2,ans = 0;for (int i = x; i <= y; i++) {ans += abs(d[i] - d[mid]);}return ans;
}
int min(int x, int y) {return x > y ? y : x;
}
int main() {int m, n;cin >> m >> n;for (int i = 2; i <= m; i++) {cin >> d[i];d[i] += d[i - 1];}//建立一所学校for (int i = 1; i <= m; i++) {for (int j = i; j <= m; j++) {dis[i][j] = cal(i, j);}}//建立n所学校for (int i = 1; i <= m; i++) {for (int j = 1; j <= n && j<=i; j++) {dp[i][j] = 999999;for(int k =1;k<i;k++){if (j == 1) { dp[i][j] = dis[1][i]; }else{dp[i][j] = min(dp[i][j], dp[k][j-1] + dis[k+1][i]);}}}}cout << dp[m][n];return 0;
}

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

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

相关文章

C++作业day6

编程1&#xff1a; 封装一个动物的基类&#xff0c;类中有私有成员&#xff1a;姓名&#xff0c;颜色&#xff0c;指针成员年纪 再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有&#xff1a;指针成员&#xff1a;腿的个数&#xff08;整型 …

从自动化到测开,测试人员逆袭之路从此起步!

在当今竞争激烈的软件测试行业中&#xff0c;近期的招聘市场确实面临一些挑战。大量的求职者争相涌入岗位&#xff0c;许多热衷于功能测试的人士甚至难以找到理想的工作机会。更不幸的是&#xff0c;连自动化测试和性能测试这些专业领域也受到了测试开发人员的竞争压力。然而&a…

stm32-模拟数字转化器ADC

接线图&#xff1a; #include "stm32f10x.h" // Device header//1: 开启RCC时钟&#xff0c;包括ADC和GPIO的时钟//2&#xff1a;配置GPIO将GPIO配置为模拟输入模式//3&#xff1a;配置多路开关将左边的通道接入到规则组中//4&#xff1a;配置ADC转…

北京市密云办理营业性演出许可所需材料及注意事项

尊敬的客户&#xff0c;您好&#xff01;我们是北京经典世纪集团有限公司&#xff0c;专注于资 质代办服务。在这篇文章中&#xff0c;我们将为您介绍一下在北京市密云地区办理营业性演出许可所需的材料及需要注意的事项。&#xff08;游览器搜经典世纪胡云帅&#xff09; 办理…

买堡垒机的企业主要目的是什么?哪家堡垒机好?

近几年企业越来越重视网络安全了&#xff0c;也越来越多的企业购买了堡垒机。但还有一些企业不知道堡垒机是什么&#xff0c;今天我们就来聊聊买堡垒机的企业主要目的是什么以及哪家堡垒机好。 买堡垒机的企业主要目的是什么&#xff1f; 一般买堡垒机的企业目的不外乎是这三个…

学习笔记Day11:初探Linux

Linux系统初探 Linux系统简介 发行版本Ubuntu/centOS&#xff0c;逻辑一样&#xff0c;都可以用。 服务器 本质是一台远程电脑&#xff0c;大多数服务器是Linux系统&#xff0c;通常使用命令行远程访问而不是桌面操作。LInux服务器允许多用户同时访问。NGS组学测序数据上游…

OSPF虚链路vlink

OSPF虚链路——vlink&#xff08;使得其他区域和骨干区域相连&#xff09; 虚链路&#xff1a;一定是跨越非骨干区域连接的 1、虚链路属于区域0的逻辑链路 2、虚链路只能穿越1个非骨干区域 3、虚链路不能穿越特殊区域&#xff1b; vlink在配置的时候&#xff0c;需要指对方…

后端工程师快速使用vue和Element

文章目录 Vue1 Vue概述2 快速入门3 Vue指令3.1 v-bind和v-model3.2 v-on3.3 v-if和v-show3.4 v-for3.5 案例 4 生命周期 Element快速使用1 Element介绍2 快速入门3 当前页面中嵌套另一个页面案例代码案例截图 Vue 1 Vue概述 通过我们学习的htmlcssjs已经能够开发美观的页面了…

XUbuntu22.04之自定义fd+rg极速命令组合(二百二十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

《探索AI辅助研发的未来之路》

在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到各个领域&#xff0c;其中之一便是研发领域。AI辅助研发正以惊人的速度改变着我们对于创新和发现的理解。本文将从技术进展、行业应用、挑战与机遇、未来趋势、法规影响以及人才培养等方…

Vcenter 6.7部署文档

下载VMware-VCSA-all-6.7.0 iso文件 找到installer文件夹 ## 找到win32目录 点击installer 接下来按照截图一步步安装 开始进行安装 进度部署第二阶段 配置一个内部NTP 服务器 配置VCenter的登录用户名和密码 ## vcenter配置开始

适用于 Windows电脑的 iPad 数据恢复软件

如何在 Windows 11/10/8/7 上从 iPad 恢复丢失的数据&#xff1f;其实很简单。您只需在 Windows 11/10/8/7 上下载并安装 iPad 数据恢复软件。然后您可以运行该软件扫描您的 iPad 并查找已删除/丢失的数据。iPad 中的 iOS 数据&#xff08;包括消息、聊天记录、联系人、照片和视…

Vue学习日记 Day7 —— json-server工具、基于VueCli自定义创建项目、postcss插件

一、前一天Vuex总结 1、state作用&#xff1a;存放数据定义&#xff1a;state:{//数据 }使用&#xff1a;//放在data下(1)根节点直接访问this.$store.state.数据名(2)模块直接访问this.$store.state.模块名.数据名(3)根节点辅助函数mapState([所需要的数据])(4)模块辅助…

CTF题型 SSTI(1) Flask-SSTI-labs 通关 题记

CTF题型 SSTI(1) Flask-SSTI-labs 通关 题记 文章目录 CTF题型 SSTI(1) Flask-SSTI-labs 通关 题记前记获取键值或下标的方式获取属性的方式 Level 1 no wafLevel 2 bl[\{\{]Level 3 no waf and blindLevel 4 bl[[, ]]获取键值或下标 Level 5 bl[\, "]Level 6 bl[_]Level …

Java安全基础 必备概念理解

Java安全基础 关键概念汇总 文章目录 Java安全基础 关键概念汇总前置知识1.构造器this以及包的使用2.继承3.重写/ 重载 / super4.多态5.区分和equals方法6.toString的使用7.Object的概念8.static,final,代码块static代码块final 9.动态代理10.类的动态加载1)类加载器含义&#…

【教程】APP加固的那些小事情

摘要 APP加固是保护APP代码逻辑的重要手段&#xff0c;通过隐藏、混淆、加密等操作提高软件的逆向成本&#xff0c;降低被破解的几率&#xff0c;保障开发者和用户利益。本文将介绍APP加固常见失败原因及解决方法&#xff0c;以及处理安装出现问题的情况和资源文件加固策略选择…

【InternLM 笔记】OpenXLAB浦源的基本操作

OpenXLab网址 网址&#xff1a;OpenXLab浦源 模型 创建模型 页面右上角选择【创建】然后选择【创建模型】 创建模型的页面如下 感觉页面中的提示信息填写相应的内容&#xff0c;全部填完后点页面下方的【立即创建】完成模型的创建 模型上传 安装所需的工具 apt install …

目标检测——玉米叶感染数据集

一、重要性 首先&#xff0c;玉米作为世界上重要的粮食作物之一&#xff0c;其生长状况直接影响到粮食产量和粮食安全。玉米叶感染是玉米生长过程中常见的病害之一&#xff0c;会导致玉米叶片出现肿胀、皱缩、扭曲变形等症状&#xff0c;严重时甚至可能形成瘤状物。因此&#…

【LIMS】微服务

目录 一、服务解决方案-Spring Cloud Alibaba1.1选用原因&#xff08;基于Spring Cloud Alibaba的试用场景&#xff09;1.2 核心组件使用前期规划 部署 nacos部署 mino使用JavaFreemarker模板引擎&#xff0c;根据XML模板文件生成Word文档使用JavaFlowable 工作流引擎前端 -vue…

js获取年月日

const date new Date()const options { year: numeric, month: 2-digit, day: 2-digit }const dateString date.toLocaleDateString(zh-CN, options)const [year, month, day] dateString.split(/)console.log(year, month, day) 人工智能学习网站&#xff1a; https://ch…