递推算法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++) {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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux:网络的初步认知

文章目录 网络的认知如何理解协议网络分层OSI模型TCP/IP五层(或四层)模型网络传输的基本流程协议的参与局域网通信原理 本篇将会引入到网络的话题 网络的认知 第一个问题是&#xff0c;网卡是文件吗&#xff1f;答案是显然的&#xff0c;在Linux下一切皆文件&#xff0c;基于…

大模型日报 3月14日

资讯 研究 智能体的ChatGPT时刻&#xff01;DeepMind通用AI向人类玩家进化&#xff0c;开始理解游戏 https://mp.weixin.qq.com/s/-GNZaY9vPQJCJUD7WGTjGA 视频游戏是 AI 系统的重要试验场。与现实世界一样&#xff0c;游戏也是丰富的学习环境&#xff0c;具有反应灵敏的实…

Hive SQL必刷练习题:向用户推荐朋友收藏的商品(两种思路)

问题需求&#xff1a; 需要请向所有用户推荐其朋友收藏但是用户自己未收藏的商品&#xff0c;请从好友关系表&#xff08;friendship_info&#xff09;和收藏表&#xff08;favor_info&#xff09;中查询出应向哪位用户推荐哪些商品。期望结果如下&#xff1a; 1&#xff09;…

【算法专题突破】--- 动态规划 --- 第 N 个泰波那契数 三步问题(1)

1.第 N 个泰波那契数 1.题目解析 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 1. 定义状态表 首先&#xff0c;我们要明白这道题的核心是找出一个序列中的数&#xff0c;这个序列遵循特定的规律&#xff1a;每个数…

简析|创业老隋分享的人力RPO项目如何?

在当今社会&#xff0c;创业热潮席卷而来&#xff0c;各类项目层出不穷。近日&#xff0c;创业老隋分享的人力RPO项目引起了广泛关注。那么&#xff0c;这个项目究竟如何呢?是否靠谱?经过深入了解和分析&#xff0c;我认为这个项目是靠谱的。 首先&#xff0c;从项目的背景和…

idea远程试调jar、远程试调war

idea远程试调jar、远程试调war 目的&#xff1a;测试运行时与ide开发时是否一致。 配置jar Maven中添加 <packaging>jar</packaging>将其打包为jar。 设置运行入口main 编译jar 看到jar输出 配置试调 添加jar运行 远程试调 先在源码中打好断点试调 debug运行…

angularjs 指令实现自定义滚动条

场景&#xff1a;横向商品栏&#xff0c;把原有的滚动条改成自定义的样式&#xff0c;并且给两边加上箭头可以调整&#xff0c;可以拖动商品和滚轮实现滚动条效果。 js appService.directive(customScrollbar, function() {return {restrict: A,transclude: true,scope: {ena…

Docker简介及用途,为什么要使用Docker?Docker容器和虚拟机的区别?

Docker简介 前言 前端有必要学习Docker吗&#xff1f;有&#xff01;&#xff01;不仅要学Docker&#xff0c;还要学习Kubernetes (K8s)&#xff0c;Jenkins 那问题来了&#xff0c;Docker,k8s,jenkins到底要先学习那个呢&#xff1f;当然是Docker 总结来说&#xff0c;先学习…

Cookie 信息泄露 Cookie未设置http only属性 原理以及修复方法

漏洞名称&#xff1a;Cookie信息泄露、Cookie安全性漏洞、Cookie未设置httponly属性 漏洞描述&#xff1a; cookie的属性设置不当可能会造成系统用户安全隐患&#xff0c;Cookie信息泄露是Cookiehttp only配置缺陷引起的&#xff0c;在设置Cookie时&#xff0c;可以设置的一个…

大厂设计师视角下的产品设计完整流程解析!

我相信在激烈的市场竞争中&#xff0c;我们看到了很多半途而废的竞争产品&#xff0c;产品设计过程可以为产品提供很好的解决方案。什么是产品设计过程&#xff1f;产品设计过程由以用户为中心的数字产品设计过程组成&#xff0c;遵循多学科方法。其主要目标是创造优秀的产品&a…

边缘计算+WEB端应用融合:AI行为识别智能监控系统搭建指南 -- 整体介绍(一)

专栏目录 边缘计算WEB端应用融合&#xff1a;AI行为识别智能监控系统搭建指南 – 整体介绍&#xff08;一&#xff09; 边缘计算WEB端应用融合&#xff1a;AI行为识别智能监控系统搭建指南 – 边缘设备图像识别及部署&#xff08;二&#xff09; 边缘计算WEB端应用融合&#xf…

语言、支付、社交:独立站本地化攻略全揭秘,助您征服海外市场

随着全球化的推进和互联网技术的飞速发展&#xff0c;独立站营销已成为许多企业开拓国际市场、提升品牌影响力的重要手段。然而&#xff0c;要在不同国家和地区取得成功&#xff0c;必须制定精准的本地化营销策略&#xff0c;以迎合目标市场的文化和习惯。本文Nox聚星将和大家探…

MB10F-ASEMI适配器专用整流桥MB10F

编辑&#xff1a;ll MB10F-ASEMI适配器专用整流桥MB10F 型号&#xff1a;MB10F 品牌&#xff1a;ASEMI 封装&#xff1a;MBF-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;1A 功率(Pd)&#xff1a;中小功率 芯片个数&#xff1a;4 …

[QJS xmake] 非常简单地在Windows下编译QuickJS!

文章目录 前言准备C编译器xmake编译包 工程准备修改版本号第一遍编译第二遍编译效果 前言 quickjs是个很厉害的东西啊&#xff0c;我一直想编译一下的&#xff0c;奈何一直没成功。现在找了点时间成功编译了&#xff0c;写篇文章记录一下。当前版本&#xff1a;2024-1-13 应该…

python自定义日历库,与对应calendar库函数功能基本一致

目录 自定义日历库 常用列表 日期列表 常用函数 闰年判断 月份天数 元旦序号 日历表头 星期序号 序号及天数 月历字串 打印月历 年历字串 打印年历 对比测试 测试结果 完整代码 运行结果 自定义日历库 自定义日历库函数&#xff0c;并使得其与python calend…

idea 开发serlvet班级通讯录管理系统idea开发mysql数据库web结构计算机java编程layUI框架开发

一、源码特点 idea开发 java servlet 班级通讯录管理系统是一套完善的web设计系统mysql数据库 系统采用serlvetdaobean mvc 模式开发&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 servlet 班…

KKVIEW远程: TODESK退出了还能远程吗

Todesk退出了还能远程吗 当我们谈论Todesk或其他远程桌面软件时&#xff0c;一个经常被提及的问题是&#xff1a;当我退出Todesk后&#xff0c;是否仍然可以远程访问我的计算机&#xff1f;为了回答这个问题&#xff0c;我们首先需要了解Todesk的工作原理和远程访问的基本条件…

Android和IOS Flutter应用开发使用 Provider.of 时,可以使用 listen: false 来避免不必要的重建

文章目录 listen: false解释示例 listen: false 使用 Provider.of 时&#xff0c;可以使用 listen: false 来避免不必要的重建 解释 当您使用 Provider.of 获取状态对象时&#xff0c;默认情况下&#xff0c;该对象每次发生变化时都会触发重建该对象所在的组件。这在大多数情…

Machine Learning ---- Gradient Descent

目录 一、The concept of gradient&#xff1a; ① In a univariate function&#xff1a; ②In multivariate functions&#xff1a; 二、Introduction of gradient descent cases&#xff1a; 三、Gradient descent formula and its simple understanding: 四、Formula o…

RocketMQ源码分析

文章目录 一、简介二、NameServer的启动过程三、Broker的启动过程四、Netty服务注册框架&#xff08;Netty框架使用的一个很好的案例&#xff09;五、Broker心跳注册过程六、Producer发送消息流程七、Consumer拉取消息的流程八、文件存储九、长轮询消息 RocketMQ源码分析基于版…