//1.leetcode 509 斐波那契数classSolution{
public:intfib(int n){
if(n <=1){
return n;}
vector<int>dp(n +1);
dp[0]=0;
dp[1]=1;for(int i =2; i <= n; i++){
dp[i]= dp[i -1]+ dp[i -2];}return dp[n];}};//优化 状态压缩classSolution{
public:intfib(int n){
if(n <2){
return n;}int pre =0, cur =1;for(int i =2; i <= n; i++){
int sum = pre + cur;
pre = cur;
cur = sum;}return cur;}};
2.leetcode 70 爬楼梯
//2.leetcode 70. 爬楼梯classSolution{
public:intclimbStairs(int n){
if(n <=2){
return n;}
vector<int>dp(n +1);
dp[1]=1;
dp[2]=2;for(int i =3; i <= n; i++){
dp[i]= dp[i -2]+ dp[i -1];}return dp[n];}};classSolution{
public:intclimbStairs(int n){
if(n <=2){
return n;}int pre =1, cur =2;for(int i =3; i <= n; i++){
int sum = pre + cur;
pre = cur;
cur = sum;}return cur;}};
3.leetcode 746 使用最小花费爬楼梯
//3.leetcode 746 使用最小花费爬楼梯classSolution{
public:intminCostClimbingStairs(vector<int>& cost){
int size = cost.size();
vector<int>minCost(size);
minCost[0]=0;
minCost[1]=min(cost[0], cost[1]);for(int i =2; i < size; i++){
minCost[i]=min(minCost[i -1]+ cost[i], minCost[i -2]+ cost[i -1]);}return minCost[size -1];}};//优化// 只用两个变量保存状态转移方程中前面的两个记录,并不断更新,就可以递推下去,这样空间复杂度就由O(N)变为O(1)了。classSolution{
public:intminCostClimbingStairs(vector<int>& cost){
int minCost0 =0;int minCost1 =min(cost[0], cost[1]);int minCost;for(int i =2; i < cost.size(); i++){
minCost =min(minCost1 + cost[i], minCost0 + cost[i -1]);
minCost0 = minCost1;
minCost1 = minCost;}return minCost;}};classSolution{
public:intminCostClimbingStairs(vector<int>& cost){
vector<int>dp(cost.size());
dp[0]= cost[0];
dp[1]= cost[1];for(int i =2; i < cost.size(); i++){
dp[i]=min(dp[i -2], dp[i -1])+ cost[i];}returnmin(dp[cost.size()-2], dp[cost.size()-1]);}};//优化classSolution{
public:intminCostClimbingStairs(vector<int>& cost){
for(int i =2; i < cost.size(); i++){
cost[i]=min(cost[i -2], cost[i -1])+ cost[i];}returnmin(cost[cost.size()-2], cost[cost.size()-1]);}};
4.leetcode 62. 不同路径
//4.leetcode 62. 不同路径classSolution{
public:intuniquePaths(int m,int n){
vector<vector<int>>dp(m,vector<int>(n,0));for(int i =0; i < m; i++){
dp[i][0]=1;}for(int j =0; j < n; j++){
dp[0][j]=1;}for(int i =1; i < m; i++){
for(int j =1; j < n; j++){
dp[i][j]= dp[i -1][j]+ dp[i][j -1];}}return dp[m -1][n -1];}};
5. leetcode 63 不同路径 II
//5. leetcode 63 不同路径 IIclassSolution{
public:intuniquePathsWithObstacles(vector<vector<int>>& obstacleGrid){
int m = obstacleGrid.size();int n = obstacleGrid[0].size();
vector<vector<int>>dp(m, vector<int>(n,0));for(int i =0; i < m && obstacleGrid[i][0]==0; i++){
dp[i][0]=1;}for(int j =0; j < n && obstacleGrid[0][j]==0; j++){
dp[0][j]=1;}for(int i =1; i < m; i++){
for(int j =1; j < n; j++){
if(obstacleGrid[i][j]==1){
continue;}
dp[i][j]= dp[i -1][j]+ dp[i][j -1];}}return dp[m -1][n -1];}};