9.12[a]

3414

如何记录区间信息?

如果要字典序最小,那么应当尽可能选少的元素,然后使其覆盖更大的区间和权重

或许应当先考虑权重,然后区间不覆盖是它的限制条件

那么直接想到的思路就是,按权重进行排序,优先选择权重最大的四个,使其满足区间不覆盖

如果这样,依然面对如何保留现有区间的问题,以及如何在区间之间进行取舍

就是说,按右端点排序,然后对于每个元素,有选和不选两种情况,如果要选的话,由于是按右端点排序选的,所以已有的数组当中右端点都不超过当前

dpij是前i个里选j个区间的最好权重和

如果选当前的,那么应当是从j-1转移过来的

然后还要求满足区间不覆盖,所以之前选择的dp该比目前选择的第i个区间的左端点要短

但是dp没保存选择的区间信息,如何知道前面区间的最右端点信息?

就是说,按右端点排序后,往后递归时,前面的区间一定不能超过当前选择区间的左端点,然后由于是按右端点排的,所以具有连续性,所以可以二分搜索,找到第一个不超过的下标p,然后前面就都可以,然后dp是说i区间之前最大的权重,所以就直接是dpp就行

那就是说对于第i个区间,如果选择,那就是在前面找p区间,然后为dppj-1

不选择,那就是dpi-1j

两重循环,最外层是j,从2到4

最里层就是i,从头到尾

初始化就是去选择i前,确定j=1时的最大权重

不过对于数组元素为数组的排序,如何操作?即按右端点来排序?

这样加上一个a.r!=b.r的判断,能够在r相同时,再对l进行排序

但是还有一个问题,dp是能找到权重的最优解,但没保留下标的信息,即最后即使知道了权重和最优是怎样的,但该如何知道其对应的

1872

考虑动态规划,最小子问题是在最右侧

定义dpi为选择到i时,与对手的最大差值

从右侧到左侧生长

对于每个数,如果选择,那么会得到此前所有数的和,对于对手的最优选择就是dpi+1,即分数差为sumi-dpi+1

(这里体现了dp中,每个子问题的求解都是独立的)

?但这里sum是得分,dp并不是得分,而是分差,应该不能直接计算

如果不选择,那么必然要在后面去选,那最大分差就是dpi+1

为什么?

i+1是否包含了后面的所有最优信息

以及sum是说玩家在当前步骤中,对i的选择所造成的得分,但无法确定前面玩家是否已经得过分?即sum是该步骤的得分,而非玩家目前的总分

还是考虑dp的干净定义,即从i开始时,目前玩家与对手所能得到造成的最大分差

dpi 到底表示什么?

在标准解法里,dpi 表示:

从状态 i 开始,轮到当前玩家操作,双方都最优时,当前玩家相对于对手的未来分差。

注意关键词:未来分差。

它不包括之前已经得过的分,因为那些分已经固定,对双方后续的最优决策没有影响。游戏是零和的,后续决策只取决于当前剩下的石子状态。

状态 i 的含义是:

· 前 i 个原始石子已经被合并成了一个新石子,放在最左边;

· 这个新石子的值等于前缀和 Pi-1;

· 剩下的原始石子是 stonesi..n-1。

所以干净定义dp后,i天然就包含了i+1及之后的最优情况

相关推荐
lisw055 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
一起学安全技术6 小时前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer
Delightrs7 小时前
Rust LeetCode238 算法题解
开发语言·算法·rust
自信150413057598 小时前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法
GoAI19 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi19 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M1 天前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen1 天前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
心仪久了会沦陷1 天前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法