阿伟在2020.09.01的刷题(动态规划),定时更新刷题过程中比较好的题目,并且放在系列刷题日记中。本期题目:leetcode:486. 预测赢——dp解决问题,难度等级:mid,出现频率较高。
1. 题目以及题目分析
2. 题目分析
可以看到,该问题的一个选择都会影响下一个选择,所以这里考虑用动态规划
3. 思考步骤
这里我用了之前文章所总结的思考方法:一键修复“一看就会,一学就废”bug——动态规划
3.1 我是谁
最终要得到选择方式1与选择方式2之间存在一个正的差值,且切割的部分是处于数组的两端,那么应该设立二维数组dp[ i ][ j ]其中i代表最左边的数组下标,j代表最右边的数组下标,代码表示为:
i = 0; j = nums.length - 1;
dp[i][j] = 在当前的选择下,两种选择方式之间的分数差值。
3.2 我要到哪里去,我从哪里来
4. 代码实现以及结果
///该文章的原创作者:阿伟加油鸭。首发于CSDN平台,装载请标注博文出处。
//网址:https://blog.csdn.net/qq_45877524/article/details/106972508
class Solution {
public:
bool PredictTheWinner(vector<int>& nums) {
int length = nums.size();
vector<int> dp(length);
for(int i = 0;i < length;i++){
dp[i] = nums[i];
}
for(int i = length - 2;i >= 0;i--){
for(int j =i + 1;j < length;j++){
dp[j] = max(nums[i] - dp[j],nums[j] - dp[j - 1]);
}
}
return dp[length - 1] >= 0;
}
};
/**
原来想法:思路基本正确,但是没有想到用dp[i][j] 来解决问题这是问题一,问题二在于子问题描述的很好但是在分析到具体方程的时候还是比较欠缺,
建议多练习,然后最后dp方程的结果的出来了没有利用,也是一个问题,直接想到到一步确实容易扯蛋,建议修改
这题考虑用dp方程,也就是所谓的动态分析来解决该问题
i = 0;j = length - 1; i = j的时候,退出dp循环
比较的应该是:
max(当前最大值 + 下一个可以选择的最大值,当前的另外一个值+下一个可以选择的最大值),这两个的比值进行i++,或者是j--进行移动数组
dp[i] = max(当前最大值 + 下一个可以选择的最大值,当前的另外一个值+下一个可以选择的最大值)
**/
类似题目:877. 石子游戏,题目描述: