什么叫动态规划?动态规划是运筹学的一个分支,是求解决策过程最优化的过程。简单来说,就是在当前状态下的最优解。
第一步:确定dp的含义
第二步:推导动态转移方程
第三步:dp的初始化
第四步:遍历顺序
第五步:打印表格
每一个动态规划题目都是围绕着这五部来的,只要每次把这五步弄清楚,相信动态规划不难。
都说动态规划最重要的是找到动态转移方程,其实初始化也同样重要,没有一个好的初始化,后面的dp也很难进行。等做到后面动态转移方程就那几个。
毕竟是初讲,我就来讲讲动态规划的入门,菲布拉契数列。
最经典的题目爬楼梯
#include<iostream>
using namespace std;
#include<vector>
int main()
{
int n;
cin >> n;
vector<int>dp(n + 1);//dp[i]的含义是到达第i阶楼梯的次数
dp[1] = 1;//dp数组的初始化
dp[2] = 2;
for (int i = 3; i <= n; i++)
{
dp[i] = dp[i - 1] + dp[i - 2];//只分析第i个的状态,(i-2)的次数跳两阶楼梯加上(i-1)的次数跳一阶楼梯就是跳到i的楼梯的次数
//同时也很容易看到这个遍历顺序是从前向后
}
//最后一步 打印表对照猜想
for (int i = 1; i <= n; i++)
{
cout << dp[i] << " ";
}
return 0;
}
五步法完成
可以感到这个题很简单
为什么?因为动态转移方程很简单 初始化很简单 遍历顺序也很简单所以这个题很简单
下次给大家介绍一下dp的所有类型的题目
并且会以五步曲来给大家讲解有什么问题可以私信我。