算法设计与分析

第一章 递推算法

1.概述

在**已知条件**和**所求问题**之间总存在着某种相互联系的关系,如果可以找到前后过程之间的数量关系(即递推式),那么,从**问题出发逐步推到已知条件**,此种方法叫逆推。
无论**顺推逆推**关键是找到**递推式**

2.斐波那切数列前n项

Fibonacci 数列:0,1,1,2,3,5,8,13,21,34,……
f0 = 0
f1 = 1
fn = fn-1 + fn-2 ( n >= 2 )
分析 : 可以用迭代方法求解

#include <iostream>
using namespace std ;
int main(){int n, i, a0, a1 ;cout << "n = " ;cin >> n ;a0 = 0 ;  a1 = 1 ;cout << a0 << "  "<< a1 << "  ";for ( i = 2; i <= n/2 ; i ++ ){a0 = a0 + a1 ;a1 = a1 + a0 ;cout << a0 << "  "<< a1 << "  ";if ( i % 5 == 0 )  cout << endl ;}if ( n > (i-1)*2 )  cout << a0+a1 << endl ;return 0;
}

2.N层汉诺塔的移动次数

递推关系分析
f(n)=2*f(n-1)+1
边界条件:f(1)=1.

#include <iostream>
using namespace std;
int main(){int f[1000]={0,1};int n;cin>>n;for(int i=2;i<=n;i++)f[i]=2*f[i-1]+1;cout<<f[n]<<endl;return 0;
}

3.猴子吃桃

猴子第一天采摘了一些桃子,第二天吃了第一天的一半多一个,第三天吃了第二天的一半多一个…直到第十天就剩下一个。问:猴子第一天摘了多少桃子?

递推关系:
f(n)=f(n-1)/2-1
f(n-1)=(f(n)+1)*2
边界条件:f(10)=1

#include <iostream>
using namespace std;
int main(){int f[11];f[10]=1;for(int i=9;i>=1;i--)f[i]=2*(f[i+1]+1);cout<<f[1]<<endl;return 0;
}

4.数字三角形

请编一个程序计算从顶到底的某处的一条路径,使该路径所经过的数字总和最大。只要求输出总和。
  1、 一步可沿左斜线向下或右斜线向下走;
  2、 三角形行数小于等于100;
3、 三角形中的数字为0,1,…,99;

测试数据通过键盘逐行输入,如上例数据应以如下所示格式输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
方法一、顺推法
F[x][y]=?
向左:
F[x-1,y]+A[x,y];
向右:
F[x-1,y-1]+A[x,y];
递推边界条件:F[1][1]=A[1][1]
最终答案?
Ans=max{F[N][1],F[N][2],…,F[N][N]}。

#include <iostream>
#include <algorithm>
using namespace std;const int MAXN = 1005;int A[MAXN][MAXN],F[MAXN][MAXN],N;int main()  {cin >> N;for(int i = 1;i <= N;i ++)for(int j = 1;j <= i;j ++)cin >> A[i][j];F[1][1] = A[1][1];for(int i = 2;i <= N;i ++)for(int j = 1;j <= i;j ++)F[i][j]=max(F[i-1][j-1],F[i-1][j])+A[i][j];int ans =0;for(int i = 1;i <= N;i ++)ans = max(ans,F[N][i]);cout << ans << endl;return 0;}

方法二、逆推法
定义F[x][y]表示从n层出发到达(x,y)的路径最大权值和。
自底向上计算:(给出递推式和终止条件)
①从底层开始,本身数即为最大数;
②倒数第二层的计算,取决于底层的数据:12+6=18,13+14=27,24+15=39,24+8=32;
③倒数第三层的计算,取决于底二层计算的数据:27+12=39,39+7=46,39+26=65

F[i][j]=max(F[i+1][j],F[i+1][j+1])+A[i][j];
递推边界条件: F[n][i]=A[n][i]

#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
int A[MAXN][MAXN],F[MAXN][MAXN],N;
int max(int a,int b){if(a>b) return a;return b;
}
int main()  {int i; cin >> N;for( i = 1;i <= N;i ++)for(int j = 1;j <= i;j ++)cin >> A[i][j];for( i = 1;i <= N;i ++)F[N][i] = A[N][i];for( i = N-1;i >=1;i --)for(int j = 1;j <= i;j ++)F[i][j]=max(F[i+1][j],F[i+1][j+1])+A[i][j];cout << F[1][1] << endl;return 0;}

5.有2n 的一个长方形方格,用一个12 的骨牌铺满方格。

编写一个程序,试对给出的任意一个n(n>0), 输出铺法总数。

【算法分析】
 (1)当n=1时,
只能是一种铺法,铺法总数有示为x1=1。
 (2)当n=2时:
骨牌可以两个并列竖排,也可以并列横排,再无其他方法,如下左图所示,因此,铺法总数表示为x2=2;
(3)当n=3时: .

当n=3时的排列骨牌的方法数是n=1和n=2排列方法数的和
4)推出一般规律:对一般的n,要求xn可以这样来考虑,
若第一个骨牌是竖排列放置,
剩下有n-1个骨牌需要排列,这时排列方法数为xn-1;
若第一个骨牌是横排列,
整个方格至少有2个骨牌是横排列(1*2骨牌),因此剩下n-2个骨牌需要排列,这是骨牌排列方法数为xn-2。
从第一骨牌排列方法考虑,只有这两种可能,所以有:
f(n)=f(n-1)+f(n-2) (n>2)
f(1)=1
f(2)=2

#include<iostream>
using namespace std;
int main(){int n,i,j,f[101];cout<<"input n:";                     //输入骨牌数cin>>n;f[1]=1;f[2]=2;  //边界条件cout<<“f[1]="<<f[1]<<endl;cout<<“f[2]="<<f[2]<<endl;for (i=3;i<=n;i++){               //递推过程f[i]=f[i-1]+f[i-2];cout<<“f["<<i<<"]="<<f[i]<<endl;}
} 

6.昆虫繁殖

科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。
每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。
假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过X个月产卵).
问过Z个月以后,共有成虫多少对?0=<X<=20,1<=Y<=20,X=<Z<=50
【输入格式】 x,y,z的数值
【输出格式】 过Z个月以后,共有成虫对数
【输入样例】 1 2 8
【输出样例】 37

分析:
每个月都有成虫产卵。
虫卵经过两个月才能变成成虫,产卵。
每个月的成虫数量是?
由前上个月的成虫和两个月之前的虫卵数量计算
每个月的虫卵是由i-x个月的成虫决定(i是当前月份。为什么不是上个月的成虫?)
定义数组f,f[i]表示第i月昆虫成虫的数量
添加一个辅助数组b,b[i]表示第i月的卵的数目,从而得到两个公式:
b[i] = f[i - x] * y; (成虫经过x月产卵 y对)f[i] = f[i - 1] + b[i - 2]; (卵经过2个月长成成虫)
每对成虫过x个月产y对卵,Z个月后成虫的数量
样例输入:
1 2 8

#include<iostream>
using namespace std;
int main(){long long a[101]={0},b[101]={0},i,j,x,y,z;cin>>x>>y>>z;for(i=1;i<=x;i++){a[i]=1;b[i]=0;}for(i=x+1;i<=z+1;i++){           //因为要统计到第z个月后,所以要for到z+1b[i]=y*a[i-x];a[i]=a[i-1]+b[i-2];                 }  cout<<a[z+1]<<endl;return 0;
}

算法设计与分析第一章递推算法相关推荐

  1. 哈工大威海算法设计与分析_计算机算法设计与分析第一章 算法概述

    晓强Deep Learning的读书分享会,先从这里开始,从大学开始.大家好,我是晓强,计算机科学与技术专业研究生在读.我会不定时的更新我的文章,内容可能包括深度学习入门知识,具体包括CV,NLP方向 ...

  2. 算法设计与分析第一章课后作业

    第一章 一.单选题 1 [单选题]子程序(包括函数和方法)是用来被调用的,递归指的是 A. 不同子程序之间直接或间接调用的程序设计方法 B. 同一个子程序直接或间接调用自己的程序设计方法 C. 子程序 ...

  3. 【算法设计与分析】09 递推方程与算法分析

    关于什么是递推方程,这里就不再多说了.本文主要讲讲简单的递推方程来求解算法的时间复杂度 文章目录 1. 递推方程的引入 1.1 插入排序时间复杂度求解 1.2 二分归并排序时间复杂度求解 2 总结 1 ...

  4. 算法设计与分析第一章作业

    1.请上网了解编码规范,说明你本学期的主要编码规范. 腾讯的编码规范: 1.C++:对于C++来说,在2007年,腾讯就发布了C++编码规范,主要针对其公司的所有软件产品源代码范围的C和C++编码风格 ...

  5. 算法设计与分析——十大经典排序算法二(6--10)

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com  Time of completion:2023.3.1 Las ...

  6. 算法设计与分析_[04] 天牛须算法设计思想分析

    原文链接: https://arxiv.org/abs/1710.10724​arxiv.org 算法实现: 首先,初始化参数 ,分别代表初始解,初始的搜索范围,以及更新步长,且通过原文我们知道: 在 ...

  7. 【算法设计zxd】第一章 算法基础 4.设计工具【三角矩阵,】

    目录 1. 循环设计 (1) 设计思维 自底向上的设计(Down - Top Design) 自顶向下的设计(Top-Down Design) (2)挖掘内在规律构建计算模型 [例1-3]设计算法,输 ...

  8. YbtOJ「基础算法」第1章 递推算法

    YbtOJ 大全 [例题1]错排问题 设 f [ n ] f[n] f[n] 表示 n n n 个数时的合法方案数.初始化 f [ 1 ] = 0 , f [ 2 ] = 1 f[1]=0,f[2] ...

  9. 【算法设计zxd】第一章 算法基础 1.基本概念+最大公约数

    目录 一.基本概念: 例1-1:求最大公约数 问题分析: 计算模型: 1) 穷举法 2) 欧几里德算法(辗转相除法) 算法设计与描述: 算法分析-效率: 1) 穷举法: 2) 欧几里德算法分析-渐近法 ...

最新文章

  1. 文件上传案例优化(文件命名循环接收多线程提高效率)
  2. 2013年测试基于Web的Spring应用程序(第1部分)
  3. 基于jQuery日历插件制作日历
  4. 基于.NET实现数据挖掘--关联规则分析算法
  5. oracle数据库 bug,Oracle bug之vipca无法执行问题的解决
  6. 量子计算机和量子干涉,量子计算中的干涉
  7. 查看AIX系统cpu、内存、网卡、硬盘、HBA卡信息命令
  8. Halcon 基本算子释义
  9. 【CCCC】L3-006 迎风一刀斩 (30分),几何关系,找规律 (拼合多边形==斜边等价)
  10. android java 图形_java – 在Android中呈现的图像上的锯齿状边缘
  11. grid@m3#39;s password: Permission denied, please try again.
  12. bzoj2530 [POI2011]Party
  13. 基于卷积神经网络的人脸表情识别综述
  14. 基于python下django框架 实现校园二手书籍交易系统详细设计
  15. 职称计算机考试常用的命令,Visual FoxPro常用命令分类表
  16. Java实验报告四,研究生薪资管理,创建一个抽象交通工具Vehicle类,经理与员工工资等实验
  17. cherry-pick多次
  18. c语言大小写字母相互转化,(c语言)字符串的大小写字母转化函数
  19. 汇编-ARMv8架构指令集
  20. 8.1 (电脑配置) 联想 启天M4390 台式电脑台式机电脑配置

热门文章

  1. SpringSecurity学习笔记(三)自定义资源拦截规则以及登录界面跳转
  2. 注册@MSN.com后缀邮箱的地址
  3. Memkind 例程1 调用memkind_malloc()分配内存
  4. Java 数据交换格式反射机制SpringIOC原理分析
  5. 阿里云服务器如何使用并且后续能干嘛
  6. 2023年医疗器械维修培训计划
  7. Vue,js前端实现语音实时转换文字,前端实现浏览器语音实时转换为文字,vue阿里云语音转文字
  8. 竟成408计算机考研辅导书介绍
  9. 如何写出优美的代码-写的爽读的爽
  10. java基础学习—— 六