算法实验室-27-分糖果[动态规划][candies[i] = max{candies[i-1], candies[i+1]} + 1]

动态规划本质

你需要通过某个常见(明显)的关键句直接定位当前的问题是否适合采用动态规划

首先,我们要撸一个关键句:

分数高的小朋友比他旁边得分低的小盆友的糖果多

然后我们就能够构建一个状态转移方程

candies[i] = max{candies[i-1], candies[i+1]} + 1

有了状态转移方程,那你岂不是可以...嘿嘿嘿嘿?

我会单独开一个算法实验室-动态规划总结里面去总结遇到的可能的动态规划的套路。

基于状态转移方程实现代码

candies[i] = max{candies[i-1], candies[i+1]} + 1

->candies[i] = max(candies[i-1]+1,candies[i]);

->candies[i]= max(candies[i],candies[i+1]);

然后有:

public int candy (int[] ratings) {
        // write code here
        
        int[] candys = new int[ratings.length];
        //每人送一个糖
        for(int i =0;i<candys.length;i++){
            candys[i] = 1;
        }
        
        //从如果当前的人的分数大于左手边的人
        //给多分的那个人一颗糖
        int sum = 0;
        for(int i =1;i<ratings.length;i++){
            
            if(ratings[i]>ratings[i-1]){
                candys[i] = Math.max(candys[i],candys[i-1]+1);
            }
            
        }

        //至于为什么方向是length-2~0的方向进行遍历
        //只能说从状态方程,cur>cur+1(和右边的分数进行比较)所以是从右到左
        //这样做,你能打到一个“消耗最小的糖”的输出
        for(int i =ratings.length-2;i>=0;i--){
            if(ratings[i]>ratings[i+1]){
                
                candys[i] = Math.max(candys[i],candys[i+1]+1);
            }
        }
        
        //统计
        int sum2 = 0;
        for(int i :candys){
            sum2 += i;
        }
        return sum2;
    }

原题今日份5/10;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值