leetcode刷题(2022.05.11)
昨天没更了,忙别的事儿。估计过两天还得停。md一学期一下就过去了要,各种大作业开始堆起来了。今天写动态规划专题,从线性DP开始。
DP解题步骤
- 设计状态(预估时间空间复杂度)
- 推导状态转移方程
- 设定初始状态
- 处理非法状态
- 执行状态转移
- 后处理
- 返回解
大致的流程,详细的可以去看动态规划我也是照这个刷。。
198.House Robber
难度:中等
题目大意
从数组中取值,不能取两个连续位置的值,最后返回能取到的最大值。
解题思路
1.数据范围:数组长度[1,100],数值满足[0,400]. 2.推导状态转移方程: 定义一个状态数组ans用于存当前位置的能取的最大值。 题中说明,数组非负且不能取连续位置的值。所以每个位置上的值ans[i]=max(ans[i-2],ans[i-3])+nums[i]取得。因为只要前面能取值,都是可以增大的,又因为跨步更大的话,可以通过另一种方式取得,还可以多取一个数值。定义状态方程之后,遍历数组,更新状态方程,最后因为不能连续取值,所以输出状态数组最后两个状态中的最大值即可。
代码
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
if(n<4)
{
if(n==3)return nums[0]+nums[2]>nums[1]?nums[0]+nums[2]:nums[1];
else if(n==2)return max(nums[0],nums[1]);
else return nums[0];
}
vector<int>ans(n);
ans[0]=nums[0];ans[1]=nums[1];ans[2]=ans[0]+nums[2];
int temp=max(ans[2],ans[1]);
for(int i=3;i<n;i++)
{
ans[i]=max(ans[i-2],ans[i-3])+nums[i];
}
return max(ans[n-1],ans[n-2]);
}
};
过题情况
改进
dp的题没啥改进的,时间复杂度已经为O(n)了。
|