动规五部曲:
1.dp数组以及下标的含义
2.递推公式
3.dp数组如何初始化
4.dp数组遍历顺序
5.打印dp数组
总结应用场景:
1.某个位置状态跟前面位置状态有关联关系
2.实现某样东西有多少种不同的方法
3.实现某件事的最小花费
斐波那契额数列:
(1)确定dp[i]含义,第i个斐波那契数列
(2)递推公式:dp[i]=dp[i-1]+dp[i-2];
(3)初始化:dp[0]=1,dp[1]=1;
(4)遍历顺序:从前到后
(5)打印dp数组
#include<stdio.h>
int main(){
int i;
int dp[10]; //(1)
dp[0]=1,dp[1]=1; //(2)
for(i=2;i<10;i++){ //(4)
dp[i]=dp[i-2]+dp[i-1]; //(3)
}
for(i=0;i<10;i++){
printf("%d\n",dp[i]); //(5)
}
return 0;
}
爬楼梯:
n阶楼梯,一步可以迈一步或两步台阶,到达楼顶多少种方法
(1)确定dp[i]含义,到达第i阶台阶的方法数
(2)递推公式:dp[i]=dp[i-1]+dp[i-2];
(3)初始化:dp[1]=1,dp[2]=2;
(4)遍历顺序:从前到后
(5)打印dp数组
变型版斐波那契额数列,代码略;
使用最小花费爬楼梯:
每个台阶爬上去消耗的体力不同,求爬到顶楼的最小花费:
(1)确定dp[i]含义,到达第i阶台阶的最小花费
(2)递推公式:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
(3)初始化:dp[0]=0,dp[1]=0;
(4)遍历顺序:从前到后
(5)打印dp数组
#include<stdio.h>
int min(int a,int b){
if(a<=b){