动规来力!!!
2140.解决智力问题
给你一个下标从 0 开始的二维整数数组 questions ,其中 questions[i] = [pointsi, brainpoweri] 。
这个数组表示一场考试里的一系列题目,你需要 按顺序 (也就是从问题 0 开始依次解决),针对每个问题选择 解决 或者 跳过 操作。解决问题 i 将让你 获得 pointsi 的分数,但是你将 无法 解决接下来的 brainpoweri 个问题(即只能跳过接下来的 brainpoweri 个问题)。如果你跳过问题 i ,你可以对下一个问题决定使用哪种操作。
比方说,给你 questions = [[3, 2], [4, 3], [4, 4], [2, 5]] :
- 如果问题 0 被解决了, 那么你可以获得 3 分,但你不能解决问题 1 和 2 。
- 如果你跳过问题 0 ,且解决问题 1 ,你将获得 4 分但是不能解决问题 2 和 3 。
请你返回这场考试里你能获得的 最高分数。
提示:
- 1 <= questions.length <= 105
- questions[i].length == 2
- 1 <= pointsi, brainpoweri <= 105
解题思路
解决我的智力问题(不是🤯
看了题解发现是打家劫舍的变体题,所以带着一块儿做了。
👉相当于如果选了k,接下来有x个不能选:打家劫舍是x=1,本题x=questions[i][1]。
子问题
原问题:“完成考试(即所有题都已解决or跳过)能获得的最大分数”→子问题:“完成前k道题能获得的最大分数”递推关系
👉已知子问题f(k),那么只关注当前(即第k道)题,只有两种做题方法:
做k && 做k+xor不做k && 做k+1
👉递推关系:f(k)=max{f(k-1),k-1道题的分数+f(k-1+x)}
边界:无题目(k=0)和只有一道题(k=1)
- dp数组的计算顺序
✅️dp[k]依赖于dp[k-1]和dp[k-1+x]
不对。这题搞得我现在有点懵,这会正好感冒昏昏沉沉的😵💫等我二编…
完整代码
53.最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
提示:
- 1 <= nums.length <= 105
- -104 <= nums[i] <= 104
解题思路
经典解法:Kadane算法。核心思路是动态规划,通过遍历数组维护当前最大子数组和。整体思路如下:
1️⃣维护两个变量:
sum当前最大子数组和maxsum全局最大子数组和
2️⃣遍历数组,每次决定是否扩展当前子数组- 如果
sum+nums[i] < nums[i]从nums[i]重新开始(之前的子数组必定与最大和无关 - 否则继续累加nums[i]
3️⃣每次更新maxsum
完整代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum=nums[0];
int maxsum=nums[0];
for(int i=1;i<nums.size();i++){
sum=max(nums[i],sum+nums[i]);
maxsum=max(sum,maxsum);
}
return maxsum;
}
};
