C++算法之动态规划1

动态规划的思想是将待求解问题分解成若干简单的子问题,提取这些子问题的特征,这些子问题可以看成解决问题的各个阶段,解析来寻找各阶段间相互转移的公式,最后按顺序求解每一阶段的问题。各阶段间的转移公式又叫“状态转移方程”,使用动态规划思想解决问题,实际上就是确定该问题的“状态转移方程”。

1 斐波那契数

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1

F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n) 。

以上问题可以通过动态规划思想解决。假设当前阶段为n,根据公式F(n) = F(n - 1) + F(n - 2)

该阶段的值F(n)可以分解成求解F(n-1)和F(n-2)两个子问题,以此类推。而公式F(n) = F(n - 1) + F(n - 2)就是“状态转移方程”。解决以上题目的核心代码为

for(int i=2; i<=n; i++)
{
	f[i] = f[i-1] + f[i-2];
}

该for循环根据“状态转移方程”,从斐波那契数列的第3个数开始计算,直至第n个数。

解决斐波那契数问题的完整代码如下所示:

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

2 数楼梯

题目描述

楼梯有 N阶,上楼可以一步上一阶,也可以一步上二阶。

编一个程序,计算共有多少种不同的走法。

输入格式

一个数字,楼梯数。

输出格式

输出走的方式总数。

假设当前处于第n个台阶上,走的方式总数为F(n),因为可以一步一阶,也可以一步两阶,所以前一个阶段可能是从第n-1阶走到n阶台阶的,也可能是从n-2阶走到n阶台阶的。当前走道n阶的总方式等于走到n-1阶的总方式加上走到n-2阶的总方式,也就是

F(n) = F(n-1)+F(n-2)

该方程即为“状态转移方程”。以下代码为解决该问题的代码

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

其中,f[1]表示走到第1阶台阶方式的总数,f[2]表示走到第2阶台阶方式的总数。

猜你喜欢

转载自blog.csdn.net/hou09tian/article/details/129294079