目录
1.第一题
画图分析:
使用动态规划解决问题
1.确定状态表示 根据经验+题目要求
dp[i]表示:选择到i位置时,最长的预约时长
但这里其实还可以再划分这个状态表示,选择到i位置时,对于i位置有选与不选两种情况
f[i]:表示选择到i位置时,i位置值(nums[i])必选,最长的预约时长
g[i]:表示选择到i位置时,nums[i]不选,最长的预约时长
2.状态转移方程
3.初始化
根据状态转移方程,发生越界的是f[0],g[0]
根据状态表示,f[0]表示选择到0位置,且nums[0]必选的最长时长 f[0]=nums[0]
同理,g[0]=0
4.填表顺序 从左往右两个表一起填
5.返回值
对于最后一个位置(n-1)有选与不选两种情况,即返回max(f[n-1],g[n-1])
具体代码
int massage(vector<int>& nums)
{
int n=nums.size();
if(n==0) return 0;//处理边界
vector<int> f(n),g(n);
f[0]=nums[0];
for(int i=1;i<n;++i)
{
f[i]=g[i-1]+nums[i];
g[i]=max(f[i-1],g[i-1]);
}
return max(f[n-1],g[n-1]);
}
打家劫舍问题
1.第二题
画图分析
使用动态规划来解决
1.确定状态表示
dp[i]:表示当偷到i位置的房屋时,此时的偷到的最高金额
但同样的对于i位置的处理,可以有偷与不偷两种情况
f[i]:表示偷到i位置时,偷i位置(nums[i]),此时的最高金额
g[i]:表示偷到i位置时,不偷nums[i],此时的最高金额
2.状态转移方程
3.初始化
根据状态表示,f[0]=nums[0],g[0]=0
4.填表顺序 从左往右两个表一起填
5.返回值
对于最后一个位置(n-1)有选与不选两种情况,即返回max(f[n-1],g[n-1])
具体代码
int rob(vector<int>& nums)
{
//1.创建dp表
//2.初始化
//3.填表
//4.返回值
int n=nums.size();
vector<int> f(n),g(n);
f[0]=nums[0];
for(int i=1;i<n;++i)
{
f[i]=g[i-1]+nums[i];
g[i]=max(f[i-1],g[i-1]);
}
return max(f[n-1],g[n-1]);
}
2.第三题
画图分析
&n