LeetCode每日一题 | 1690. 石子游戏 VII

文章目录

题目描述

原题链接

石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 。

有 n 块石子排成一排。每个玩家的回合中,可以从行中 移除 最左边的石头或最右边的石头,并获得与该行中剩余石头值之 和 相等的得分。当没有石头可移除时,得分较高者获胜。

鲍勃发现他总是输掉游戏(可怜的鲍勃,他总是输),所以他决定尽力 减小得分的差值 。爱丽丝的目标是最大限度地 扩大得分的差值 。

给你一个整数数组 stones ,其中 stones[i] 表示 从左边开始 的第 i 个石头的值,如果爱丽丝和鲍勃都 发挥出最佳水平 ,请返回他们 得分的差值 。

问题分析

sum[i]为前 i 个石头的值之和

状态定义dp[i][j]表示从第 i 个石头到第 j 个石头,他们得分的差值

状态计算dp[i][j] = max(sum[j + 1] - sum[i + 1] - dp[i + 1][j], sum[j] - sum[i] - dp[i][j - 1])

边界条件dp[i][i] = 0

程序代码

go 复制代码
func stoneGameVII(stones []int) int {
    n := len(stones)
    sum := make([]int, n + 1)
    dp := make([][]int, n)
    for i := 0; i < n; i++ {
        dp[i] = make([]int, n)
    }

    for i := 0; i < n; i++ {
        sum[i + 1] = sum[i] + stones[i]
    }
    
    for s := 2; s <= n; s++ {
        for i := 0; i <= n - s; i++ {
            j := i + s - 1
            dp[i][j] = max(sum[j + 1] - sum[i + 1] - dp[i + 1][j], sum[j] - sum[i] - dp[i][j - 1])
        }
    } 

    return dp[0][n-1]
}
相关推荐
baizhigangqw14 分钟前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶
算法·启发式算法·web app
C雨后彩虹27 分钟前
最多等和不相交连续子序列
java·数据结构·算法·华为·面试
cpp_25011 小时前
P2347 [NOIP 1996 提高组] 砝码称重
数据结构·c++·算法·题解·洛谷·noip·背包dp
上海云盾-小余1 小时前
DDoS 攻击应急响应全流程:从告警触发到业务恢复的黄金 15 分钟
服务器·安全·游戏·ddos
Hugh-Yu-1301231 小时前
二元一次方程组求解器c++代码
开发语言·c++·算法
编程大师哥2 小时前
C++类和对象
开发语言·c++·算法
加农炮手Jinx2 小时前
LeetCode 146. LRU Cache 题解
算法·leetcode·力扣
Rabitebla2 小时前
C++ 和 C 语言实现 Stack 对比
c语言·数据结构·c++·算法·排序算法
加农炮手Jinx2 小时前
LeetCode 128. Longest Consecutive Sequence 题解
算法·leetcode·力扣
旖-旎2 小时前
递归(汉诺塔问题)(1)
c++·学习·算法·leetcode·深度优先·递归