递归、递推、动态规划

问题一:已知f(1) = 1 , f(2) = 1 , 且f(n) = f(n-1) + f(n-2),则f(n)等于多少?

解法一:递归(找到递归关系和递归出口)

#include <iostream> 
using namespace std;
int n;
int Sum(int i) {
	if (i == 1 || i == 2)
		return 1;
	else
	{
		return Sum(i - 1) + Sum(i - 2);
	}
}

int main() {
	cin >> n;
	cout << Sum(n) << endl;
}

解法二:递推

#include <iostream> 
using namespace std;
int n;
int a[100];
int main() {
	cin >> n;
	a[1] = a[2] = 1;
	for (int i = 3; i <= n; i++)
		a[i]=a[i-1]+a[i-2];
	cout << a[n] << endl;
}

问题二:数字三角形,寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。

解法一:递归

#include <iostream> 
#include <algorithm> 
using namespace std;
int n;
int D[10][10];
int SumMax(int i,int j) {
	if (i == n)
		return D[i][j];
	else
	{
		return max(SumMax(i+1,j), SumMax(i+1, j+1))+D[i][j];
	}
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= i; j++)
			cin >> D[i][j];
	cout << SumMax(1, 1) << endl;
}

解法二:递推型动态规划

	#include <iostream> 
	#include <algorithm> 
	using namespace std;
	int n;
	int D[10][10];
	int Max[10];
	int main() {
		cin >> n;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= i; j++)
				cin >> D[i][j];
		for (int p = n; p >= 1; p--)
			for (int q = 1; q <= p; q++)
				if (p == n)
					Max[q] = D[n][q];
				else
					Max[q] = max(Max[q], Max[q+1])+D[p][q];
		cout << Max[1] << endl;
	}

特点:最优子结构,无后效性

空间复杂度:支持计算所必需存储的状态最多有多少

时间复杂度:初始状态到达最终状态中间需要多少步

参考文章:八年c++老司机教你彻底学会动态规划-入门篇 http://tieba.baidu.com/p/5864067675

递推与递归 https://blog.csdn.net/u013634252/article/details/80551060

什么是动态规划(Dynamic Programming)?动态规划的意义是什么?

https://www.zhihu.com/question/23995189/answer/35429905

发布了31 篇原创文章 · 获赞 2 · 访问量 708

猜你喜欢

转载自blog.csdn.net/qq446293528/article/details/102997768