问题一:已知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)?动态规划的意义是什么?