动态规划
题目大概类型:
1.计数
有多少种方式走到右下角
有多少种方法选出k个数是的和是sum
2.求最大最小值
从左上角到右下角路径的最大数字和
最长上升序列长度
3.存在性
去石子游戏。选手是否必胜
能不能选出k个数使得和是sum
注意:拆分子问题,记住过往,减少重复的计算
一般自上而下:
dp[0][0][...] = 边界值
for(状态1 :所有状态1的值){
for(状态2 :所有状态2的值){
for(...){
//状态转移方程
dp[状态1][状态2][...] = 求最值
}
}
}
1.原问题分解,穷举分析穷举的时候要注意会存在「重叠子问题」,通过分解原问题就出子问题的最值得到原问题最值
2.确定状态,边界
3.写出状态转移方程
D题思路
1.根据题目的意思可以知道dp的能量消耗,并且每次只可以跳一阶或者两阶,在原地的时候能量消耗值最小为0,即跳一阶的消耗值也可以得到只有一种。求第2阶往后的判断当前 求出状态转移方程dp[i-2]+abs(a[i]-a[i-2]),dp[i-1]+abs(a[i]-a[i-1]),然后根据题目意思每次记住过往保留他的最小值
dp[0]=0;
dp[1]=abs(a[1]-a[0]);
for(int i=2; i<n; i++)
{
dp[i]=min(dp[i-2]+abs(a[i]-a[i-2]),dp[i-1]+abs(a[i]-a[i-1]));
}