石子游戏

一、题目描述

题目链接:https://leetcode-cn.com/problems/stone-game/

 

二、题目分析

可以使用搜索的方法来解决。对于每次操作,都有两个选择,拿最左边的石堆或者拿最右边的石堆,剩下的可以到下一层递归,而且这里是可以使用memo优化的,因为先拿左边再拿右边,和先拿右边再拿左边是等价的。

 

三、代码

    private Integer[][] memo;
    public boolean stoneGame(int[] piles) {
        memo = new Integer[piles.length][piles.length];
        int sum = 0;
        for (int num: piles) {
            sum += num;
        }
        int res = stoneHelper(piles,0,piles.length-1);
        return res > (sum - res);
    }

    private int stoneHelper(int[] piles, int left, int right) {
        if (left == right) return piles[left];
        if (memo[left][right] != null) return memo[left][right];
        int pickLeft = piles[left] + stoneHelper(piles,left+1,right);
        int pickRight = piles[right] + stoneHelper(piles,left,right-1);
        return memo[left][right] = Math.max(pickLeft,pickRight);
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值