什么时候要用动态规划?
如果要求一个问题的最优解(通常是最大值或者最小值),而且该问题能够分解成若干个子问题, 并且小问题之间也存在重叠的子问题,则考虑采用动态规划。
怎么使用动态规划?
五步曲解决:
1. 判题题意是否为找出一个问题的最优解
2. 从上往下分析问题,大问题可以分解为子问题,子问题中还有更小的子问题
3. 从下往上分析问题 ,找出这些问题之间的关联(状态转移方程)
4. 讨论底层的边界问题
5. 解决问题(通常使用数组进行迭代求出最优解)
#include<iostream>
#include<Windows.h>
using namespace std;
//使用递归实现
int WalkCount(int n)
{
if (n < 0)return -1;
if (n == 1)return 1;
if (n == 2)return 2;
else {
return WalkCount(n - 1) + (n - 2);
}
}
//动态规划算法
int WalkCount2(int n) {
int tmp = 0;
if (n <= 0)return -1;
if (n == 1)return 1;
if (n == 2)return 2;
int *index = new int[n + 1];
index[0] = 0;
index[1] = 1;
index[2] = 2;
for (int i = 3; i <= n; i++) {
index[i] = index[i - 1] + index[i - 2];
}
tmp = index[n];
delete index;
return tmp;
}
//n台阶总共有多少种走法
int main2(void) {
int n = 0;
printf("请输入 台阶: \n");
scanf_s("%d", &n);
for(int i=1;i<=n;i++){
printf("走%d 级台阶共有%d 种走法\n ", i, WalkCount2(i));
}
system("pause");
return 0;
}