斐波那契数列
class Solution {
public:
int fib(int n) {
if(n==0||n==1) return n;
int dp_0=0,dp_1=1;
for(int i=2;i<=n;i++)
{
int dp=(dp_0+dp_1)%1000000007;
dp_0=dp_1;
dp_1=dp;
}
return dp_1;
}
};
青蛙跳台阶问题
和斐波那契数列一样
class Solution {
public:
int numWays(int n) {
if(n==0||n==1) return 1;
int dp0=1,dp1=1;
for(int i=2;i<=n;i++)
{
int dp=(dp1+dp0)%1000000007;
dp0=dp1;
dp1=dp;
}
return dp1;
}
};
股票的最大利润
动规五部曲:
确定dp数组及其下标的含义
dp[i][0]代表第i天持有股票所得最多现金,dp[i][1]代表第i天未持有股票所得最多现金。
确定递推关系式
dp[i][0]=max(dp[i-1][0],-prices[i])
dp[i][1]=max(dp[i-1][1],prices[i]+dp[i-1][0]);
dp数组的初始化
dp[0][0]=-prices[0];
dp[0][1]=0;
确定遍历顺序 从前往后
举例验证dp数组
这里就用二位数组,空间复杂度稍微高点
class Solution {
public:
int maxProfit(vector<int>& prices) {
int length=prices.size();
if(length==0) return 0;
vector<vector<int>> dp(length,vector<int>(2));
dp[0][0]=-prices[0];
dp[0][1]=0;
for(int i=1;i<length;i++)
{
dp[i][0]=max(dp[i-1][0],-prices[i]);
dp[i][1]=max(dp[i-1][1],prices[i]+dp[i-1][0]);
}
return dp[length-1][1];
}
};