递推算法C++

news2024/9/20 8:15:21

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

算法特点:

  • 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++) {a
		f2 = 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.coloradmin.cn/o/1528128.html

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

相关文章

第一阶段回顾

一、IP、网络等初步认知 L1~L3&#xff08;物理层到网络层&#xff09;以及端到端如何走&#xff1f;&#xff01; 1.1 OSI七层参考模型 方向 方向分为上下和左右 上下流向&#xff08;南北&#xff09;&#xff1a; 左右流向&#xff08;南北流向&#xff09;&#xff1a; 注意…

堆叠与集群

8.1堆叠与集群概述 随着企业的发展&#xff0c;企业网络的规模越来越大&#xff0c;这对企业网络提出了更高的要求&#xff1a;更高的可靠性、更低的故障恢复时间、设备更加易于管理等。传统的园区网高可靠性技术出现故障时切换时间很难做到毫秒级别、实现可靠性的方案通常为一…

高架学习笔记之信息系统分类概览

目录 零、前言 一、业务处理系统(TPS) 概念 功能 特点 二、管理信息系统(MIS) 概念 功能 组成 三、决策支持系统(DSS) 概念 功能 特点 组成 1. 数据仓库 2. 数据挖掘工具 3. 决策模型 4. 可视化界面 四、专家系统(ES) 概念 特点 组成 求解过程 专家系统…

开箱即用之 windows部署jdk、设置nginx、jar自启

jdk安装 官网下载对应的安装包&#xff0c;解压之后放在本地指定的文件夹下 传送门https://www.oracle.com/java/technologies/downloads/#jdk21-windows 我比较喜欢下载zip方式的&#xff0c;解压之后直接能用&#xff0c;不需要安装了 配置环境 JAVA_HOME 添加path路径 …

蓝桥杯-Sticks-DFS搜索

题目 样例输出是 6 5 题目中给错了&#xff0c;不知道什么时候会改。 思路 --剪枝&#xff0c;否则时间复杂度和空间复杂度过大&#xff0c;会超时。 --注意有多组测试样例时&#xff0c;需要将bool数组重新赋值为false。 --函数类型不是void&#xff0c;return语句不能省…

倍思、南卡、Cleer开放式耳机好用吗?深度测评行业精品!

​作为一名资深数码评测博主&#xff0c;我拥有五年的行业经验&#xff0c;期间深入体验了众多蓝牙耳机&#xff0c;涵盖了从新兴小众品牌到知名大厂的各种产品。我经常收到不同品牌的邀请&#xff0c;希望我能为他们的产品提供评测。在我的社交媒体私信中&#xff0c;也经常有…

【LeetCode】升级打怪之路 Day 24:回溯算法的解题框架

今日题目&#xff1a; 46. 全排列51. N 皇后78. 子集 目录 LC 46. 全排列LC 51. N 皇后LC 78. 子集 【classic】1&#xff09;思路一2&#xff09;思路二 今天学习了回溯算法的解题框架&#xff1a;回溯算法解题套路框架 | labuladong 回溯算法的整体框架都是&#xff1a; re…

在16G的GPU上微调Mixtral-8x7B

Mixtral-8x7B是最好的开源llm之一。但是消费级硬件上对其进行微调也是非常具有挑战性的。因为模型需要96.8 GB内存。而微调则需要更多的内存来存储状态和训练数据。比如说80gb RAM的H100 GPU是不够的。 这时我们就想到了QLoRA&#xff0c;它将模型大小除以4&#xff0c;同时通…

电商项目高级篇-04 nginx搭建域名访问环境

电商项目高级篇-04 nginx搭建域名访问环境 1、host文件配置2、docker命令nginx自动启动3、gulimall.com nginx反向代理到localhost:12000 1、host文件配置 SwitchHosts工具使用 添加链接描述 或者直接修改host文件 C:\Windows\System32\drivers\etc 将服务器地址映射到host文…

[C语言]指针详解一、数组指针、二维数组传参、函数指针

一、数组指针 对一个数组&#xff0c;如果我们想要让一个指针指向这个数组&#xff0c;我们应该如何定义呢?我们知道一个数组定义本来就是一个指针&#xff0c;那为何要多定义一个数组指针呢?我们来看看下面这个代码就理解了 #include <stdio.h> int main() {int arr…

android adb 实时画面 和操作

1. 下载 scrcpy 建议 windows10 用户 点击链接下载 不然可能会提示缺少部分 dll https://github.com/Genymobile/scrcpy/releases/download/v2.3.1/scrcpy-win32-v2.3.1.ziphttps://github.com/Genymobile/scrcpy/releases/download/v2.3.1/scrcpy-win32-v2.3.1.zip windo…

解决Vue发布后新旧包切换点击路由报错问题

错误截图 解决方案&#xff1a; 1.修改vue.config.js output: {// filename: js/[name].[chunkhash].${timeUpdate}.js,// chunkFilename: js/[id].[chunkhash].${timeUpdate}.jsfilename: [name].[contenthash].js,chunkFilename: [name].[contenthash].chunk.js}2.路由中添…

【算法刷题】Day32

文章目录 1. 单词拆分题干&#xff1a;算法原理&#xff1a;1. 状态表示&#xff1a;2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码&#xff1a; 2. 环绕字符串中唯一的子字符串题干&#xff1a;算法原理&#xff1a;1. 状态表示&#xff1a;2. 状态转移方程3. 初始化4. …

突破数据处理极限:揭秘亚信安慧AntDB

亚信安慧AntDB数据库在运营商自主可控替换项目中的成功应用&#xff0c;具有极其重要的意义。该数据库的落地&#xff0c;不仅为这一项目注入了强大的支持力量&#xff0c;还在更大程度上提升了整体的运营效能。作为一种高效可靠的数据库解决方案&#xff0c;AntDB引入了先进的…

苍穹外卖-day13:vue基础回顾+进阶

vue基础回顾进阶 课程内容 VUE 基础回顾路由 Vue-Router状态管理 vuexTypeScript 1. VUE 基础回顾 1.1 基于脚手架创建前端工程 1.1.1 环境要求 要想基于脚手架创建前端工程&#xff0c;需要具备如下环境要求&#xff1a; ​ node.js 前端项目的运行环境 学习web阶段已安…

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

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

Ubuntu使用Docker部署Nginx容器并结合内网穿透实现公网访问本地服务

目录 ⛳️推荐 1. 安装Docker 2. 使用Docker拉取Nginx镜像 3. 创建并启动Nginx容器 4. 本地连接测试 5. 公网远程访问本地Nginx 5.1 内网穿透工具安装 5.2 创建远程连接公网地址 5.3 使用固定公网地址远程访问 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#…

jar读取目录配置、打包jar后无法获取目录下的配置

jar读取目录配置、打包jar后无法获取目录下的配置 jar读取目录配置、打包jar后无法获取目录下的配置。java打成jar包后获取不到配置文件路径。解决项目打成jar包上线无法读取配置文件。打包jar后无法读取resource下的配置文件 场景 需要读取 src/main/resources/mapper下的所…

【Python循环4/5】跳出循环的办法

目录 导入 break 具体用法 在for循环中的运用 在while循环中的运用 continue 具体用法 区别 总结 导入 前几天的博文里&#xff0c;我们学习了for循环和while循环。 无论是for循环还是while循环&#xff0c;默认的终止条件都是边界条件。在触发边界条件之前&am…

ChatGPT4的Dalle-3 生成电影海报及升级教程

引言 首先DALL E3首先需要升级为ChatGPT4才能使用&#xff0c;接下来从以下几个方面进行介绍&#xff1a; 一、ChatGPT4中的DALL E3 的电影海报二、ChatGPT4下的DALL E3的实例三、ChatGPT4的升级教程 一、ChatGPT4中的DALL E3 的电影海报 DALLE 3可以直接在画面中识别和生成…