核心思路是选还是不选。
opt( i ) 表示到第i个台阶的最小花费,如果是【10, 15, 20】这个题目给出的台阶是0,1,2,求得就是opt( 3 )到达第三个台阶的最小花费。
就像斐波拉契数列的计算,opt(3)需要用到opt(2) opt(1) 但是有一个选还是不选的问题
上到第三个台阶可以从第二个上,也可以从第一个上,选择最小值
选第二个台阶: opt(3) = 第二个台阶的花费+上到第二个台阶的花费
不选第二个台阶: opt(3) = 第一个台阶的花费 + 上到第一个台阶的花费
递归都是有出口的,本体是opt(0) opt(1)设置为0, 从地面上到0 1 这两个台阶不花费
通过下图中的树可以看到会有重叠子问题(虽然这里的opt 1 不需要计算就是0但是我懒得画更大的树了) 所以使用一个opt数组来保存以前的计算结果
就是动态规划啦!
//
// Created by wzd on 2021/12/3.
//
//凸多边形最优三角剖分
#include<bits/stdc++.h> //万能头文件,包含了目前C++所包含的所有头文件
using namespace std;
int main() {
vector<int> cost = {10, 15, 20};
int n = cost.size();
vector<int> opt(n+1, 0);
opt[0]=0;
opt[1]=0;
for(int i=2; i<n+1; i++)
opt[i]=min(cost[i-1]+opt[i-1], cost[i-2]+opt[i-2]);
cout<<opt[n];
return 0;
}