leetcode:486. 预测赢——dp解决问题,2020.09.01

阿伟在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. 石子游戏,题目描述:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值