DP入门 - 爬楼梯
1.浅谈dp
有了前面学习分治法的经验,dp就比较好说了,分治法就是把一个问题分解成若干个不相干的子问题(分到不能再分)求解;dp通过寻找转态转移方程,去解决子问题(存在重复),它的本质属于递归。
2.
dp的三个基本要素
1.最优子结构:确保状态转移方程所选择的子问题也能给出最优解
2.边界:状态方程停止的条件
3.转态转移方程:子问题间的关系式。
3.爬楼梯
问题描述:一个人每次能爬楼梯的阶数是一阶或者两阶。给定一个阶梯的总阶数,问有多少不同的选择爬上楼梯。
输入一个整数n,表示n种阶梯数
输出n行,每行表示每一种阶梯的选择总数。
input
1
3
outout
3
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 ;
main()
{
int a[maxn];
ios::sync_with_stdio(false);
int n;
cin>>n;
while(n --)
{
int k;
cin>>k;
a[1] = 1;//表示爬一层阶梯只有一种选择
a[2] = 2;//表示爬两层阶梯一共两种选择,第一种连走两步,第二种是走一步。
/*此问题分解的子问题如上两种,其他子问题皆为上面两种的重复*/
for(int i = 3;i <= k;i ++)
a[i] = a[i - 1] + a[i - 2];
cout<<a[k]<<endl;
}
}