递推算法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.rhkb.cn/news/278975.html

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

相关文章

【绘图案例-drawrect Objective-C语言】

一、接下来,我们来说drawrect:这个方法, 1.我们把之前的copy这个代码,复制粘贴一份,改个名字, 来个“05-drawrect”, 然后呢,关于这个drawrect: drawrect:啊,我们分几点来写, 1)首先:代码为什么要写在drawrect:当中, 2)rect参数的含义:也就是说,这个rect,…

Java毕业设计 基于springboot vue招聘网站 招聘系统

Java毕业设计 基于springboot vue招聘网站 招聘系统 springboot vue招聘网站 招聘系统 功能介绍 用户&#xff1a;登录 个人信息 简历信息 查看招聘信息 企业&#xff1a;登录 企业信息管理 发布招聘信息 职位招聘信息管理 简历信息管理 管理员&#xff1a;注册 登录 管理员…

第四百一十回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容&#xff0c;本章回中将介绍如何获取时间戳.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

Windows Server 各版本搭建远程访问 / VPN 服务器实现 VPN 连接(03~19)

一、Windows Server 2003 开机后点击添加或删除角色 点击下一步 勾选自定义&#xff0c;点击下一步 点击 远程访问/VPN 服务器&#xff0c;点击下一步 点击下一步 点击下一步 勾选自定义&#xff0c;点击下一步 选择配置类型&#xff0c;点击下一步 点击完成 点击是 点击完成…

突破编程_前端_ACE编辑器(概述)

1 ACE 框架简介 ACE 框架是一个强大且灵活的前端文本编辑器框架&#xff0c;它提供了一套全面的 API 和丰富的功能&#xff0c;使得开发者能够轻松地在 Web 应用中集成功能强大的代码编辑器。ACE 编辑器不仅适用于在线代码编辑&#xff0c;还广泛应用于文档编辑、实时协作、富…

APP在应用商店该如何做好节日营销

38妇女节刚刚过去&#xff0c;不少商家吃上了一波节日红利。 你有没有注意到很多App在应用商店里改头换面&#xff0c;开展了很多以“三八节”为主题的营销活动&#xff0c;并且取得了不错的成绩。 可见季节性营销策划对产品的下载量和用户留存率还是很重要的。 那么我们如何…

2024年敏捷产品负责人CSPO认证培训

课程名称&#xff1a;Scrum Product Owner CSPO产品负责人认证 课程类型&#xff1a;经理级 课程简介&#xff1a; Scrum Product Owner产品负责人在Scrum产品开发当中扮演“舵手”的角色&#xff0c;他决定产品的愿景、路线图以及投资回报&#xff0c;他需要回答为什么做&am…

前端入职配置新电脑!!!

前端岗位入职第一天到底应该做些什么呢&#xff1f;又该怎样高效的认识、融入团队&#xff1f;并快速进入工作状态呢&#xff1f;这篇文章就来分享一下&#xff0c;希望对即将走向或初入前端职场的你&#xff0c;能够有所帮助。内含大量链接&#xff0c;欢迎点赞收藏&#xff0…

使用 Python 编写网络爬虫:从入门到实战

网络爬虫是一种自动化获取网页信息的程序&#xff0c;通常用于数据采集、信息监控等领域。Python 是一种广泛应用于网络爬虫开发的编程语言&#xff0c;具有丰富的库和框架来简化爬虫的编写和执行过程。本文将介绍如何使用 Python 编写网络爬虫&#xff0c;包括基本原理、常用库…

Python Learn day05

Python Learn day05 本文主要讲解 继承、多态、定制类 继承和多态 什么是继承 当新类想要拥有现有类的功能结构&#xff0c;可以使用继承。继承的前提是新类 is a 现有类&#xff0c;即&#xff1a; 子类 is 父类 总是从某个类继承&#xff1a; class Myclass(object):pass…

C++第七弹---类与对象(四)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、拷贝构造函数 1.1、概念 1.2、特征 2、运算符重载 2.1、等号运算符重载 总结 1、拷贝构造函数 1.1、概念 在现实生活中&#xff0c;可能…

外贸业务员如何说服老板拿到更低价

小伙伴问我说如何说服老板给到更好的价格&#xff0c;这个问题呢我在这里说一下我的观点 第一你需要去分析这个客户到底值不值得我们去给他花更多的一些心思&#xff0c;因为客户想要的这个价格既然已经突破了公司的价格标准了&#xff0c;说明他的价格要的非常的低&#xff0…

【C++】手撕AVL树

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能直接手撕AVL树。 > 毒鸡汤&#xff1a;放弃自…

Qt Creator 安装 Beautifier

启动 Beautifier 插件。 在 qtCreator 界面上&#xff0c;Help - About Plugins - C - Beautifier 勾选此项。重启 qtcreator 下载 Artisitic Style 下载地址 解压后进入目录&#xff0c;进入 build/gcc/ 执行&#xff1a;make && make install 配置 Artisitic Style…

【Flask开发实战】防火墙配置文件解析(三)之python加工处理

一、前言 上一篇文章中&#xff0c;介绍了通过shell脚本读取配置文件获取到IP地址组、服务端口组、规则清单这三个模块类别基础数据。基础数据中还需要进一步进行展开处理&#xff0c;生成三类扩展表。如IP地址组中&#xff0c;同一个地址组下存在多个IP地址&#xff0c;每组I…

Python读取Excel工作表数据写入CSV、XML、文本

Excel工作簿是常用的表格格式&#xff0c;许多数据呈现、数据分析和数据汇报都是以Excel工作表的形式进行。然而&#xff0c;在实际的数据管理、分析或自动化流程构建过程中&#xff0c;我们常常需要将这些Excel中的数据迁移至更其他数据系统&#xff0c;或者以文本形式存储以便…

B树B+树,字典树详解,哈夫曼树博弈树

目录 B树&#xff1a;B-Tree B树 字典树&#xff1a;Trie Tree 哈夫曼树 博弈树 B树&#xff1a;B-Tree 多路平衡搜索树 1.M阶B树&#xff0c;就是M叉&#xff08;M个指针&#xff09;。 2.每个节点内记录个数<M-1。 3.根节点记录个数>1。 4.其余节点内记录个数&…

洗涤杂质气体的仪器-PFA洗涤瓶

PFA洗气瓶是一种洗去气体中杂质的仪器&#xff0c;是将不纯气体通过选定的适宜液体介质鼓泡吸收&#xff08;溶解或由于发生化学反应&#xff09;&#xff0c;从而洗去杂质气体&#xff0c;以达净化气体的目的。在有可燃性气源的实验装置中&#xff0c;洗气瓶也可起到安全瓶的作…

qt使用Windows经典风格,以使QTreeView或QTreeWidge有节点线或加号

没有使用Windows经典风格的QTreeView或QTreeWidget显示如下&#xff1a; 使用Windows经典风格的QTreeView或QTreeWidget显示如下&#xff1a; 树展开时&#xff1a; 树未展开时&#xff1a; 可以看到&#xff1a; 未使用Windows经典风格时&#xff0c;QTreeView或QTreeWidget…

【Flask开发实战】防火墙配置文件解析(二)之shell读取内容

一、前言 上一篇文章中&#xff0c;介绍了防火墙配置文件包含的基本元素和格式样式&#xff0c;并模拟了几组有代表性的规则内容&#xff0c;作为基础测试数据。在拿到基础测试数据后&#xff0c;关于我们最终想解析成的数据是什么样式的&#xff0c;其实不难看出&#xff0c;…