dp_day1

dp四步

1,明确dp数组及下标含义

2.确定递推公式

3..据题意初始化dp数组

4.确定求dp数组的遍历顺序

几道简单的dp题

1.斐波那契数列

1.dp[i]含义:第i项斐波那契数列

2.递推公式:dp[i]=dp[i-1]+dp[i-2]

3.初始化:dp[1]=1,dp[2]=1

4.遍历顺序:后面的项依赖于前面的项,故从前向后遍历

class Solution {
public:
    int fib(int n) {
    int dp[35];
    dp[1]=1;dp[2]=1;
    for(int i=3;i<=n;i++)
    {
        dp[i]=dp[i-1]+dp[i-2];
    }
    return dp[n];
    }
};

2.爬楼梯

1.dp[i]含义:爬上第i阶楼梯的方法数

2.递推公式:dp[i]=dp[i-1]+dp[i-2]

3.初始化:dp[1]=1,dp[2]=2

4.遍历顺序:后面的项依赖于前面的项,故从前向后遍历

class Solution {
public:
    int climbStairs(int n) {
    int dp[50];
    dp[1]=1;dp[2]=2;
    for(int i=3;i<=n;i++)
    dp[i]=dp[i-1]+dp[i-2];
    return dp[n];
    }
};

3.使用最小花费爬楼梯

1.dp[i]含义:爬上第i阶楼梯的最小花费

2.递推公式:dp[i]=min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1]);

3.初始化:dp[0]=0,dp[1]=0

4.遍历顺序:后面的项依赖于前面的项,故从前向后遍历

class Solution {
public:
    int minCostClimbingStairs(vector& cost) {
    int n=cost.size();
    int dp[1005];
    dp[0]=0;dp[1]=0;
    for(int i=2;i<=n;i++)
    {
        dp[i]=min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1]);
    }
    return dp[n];
    }
};

你可能感兴趣的:(算法,动态规划,数据结构)