接着day1继续刷题,day2的第一题和day1的差不多,第二天的状态转移方程稍微复杂一些,但也比较简单。
LeetCode70. 爬楼梯
1.dp
class Solution {
public:
int climbStairs(int n) {
int dp[n+1];
dp[0]=1,dp[1]=1;
for(int i=2;i<=n;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
};
2.滚动数组+dp
class Solution {
public:
int climbStairs(int n) {
int pre=0,cur=1,sum=0;
for(int i=1;i<=n;i++){
sum=pre+cur;
pre=cur,cur=sum;
}
return sum;
}
};
LeetCode746. 使用最小花费爬楼梯
这题题意描述有点迷,可以看看discuss区的题意描述,意会一下就明白了。
状
态
:
d
p
[
i
]
表
示
到
达
下
标
i
的
最
小
花
费
状态:dp[i] 表示到达下标i的最小花费
状态:dp[i]表示到达下标i的最小花费
状
态
转
移
方
程
:
d
p
[
i
]
=
m
i
n
(
d
p
[
i
−
1
]
+
c
o
s
t
[
i
−
1
]
,
d
p
[
i
−
2
]
+
c
o
s
t
[
i
−
2
]
)
状态转移方程:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
状态转移方程:dp[i]=min(dp[i−1]+cost[i−1],dp[i−2]+cost[i−2])
1.dp
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n=cost.size();
int dp[n+1];
dp[0]=dp[1]=0;
for(int i=2;i<=n;i++){
dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return dp[n];
}
};
2.滚动数组+dp
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n=cost.size();
int pre=0,cur=0,sum=0;
for(int i=2;i<=n;i++){
sum=min(pre+cost[i-2],cur+cost[i-1]);
pre=cur,cur=sum;
}
return sum;
}
};