Pictures with Kittens (hard version) 1077F2

dp+deque优化

原题链接:https://codeforces.com/problemset/problem/1077/F2
题意:给你一个n长度数组,从中取x个数,每个数位置之差不超过k,求x个数累加和的最大值。
难度:2300
在这里插入图片描述
在这里插入图片描述
样例解释:
对于第一个样例我们取5 3 10即可达到最大值。
审题:
wc!这题读懂了,dp题,感觉很简单啊!啪!
解法思路:

  1. dp[i][j]表示从j个数中取i个数的最大值。
  2. 用deque+pair取第i个数时每次维护前k个数的最大值。first解决最大值,second解决每k个。

思路这就说完了,太哥哥了吧!巧了,我是弟中弟。所以后面列表讲。
二话不说先上代码,再说具体方法(学习的kmjp大佬的代码)

在这里插入图片描述

在这里插入图片描述
我们来看一看这题是怎么解决的吧。

如果问你从n(<=5000)个数组拿出x个数累加和最大你怎么做?
我知道你肯定会sort排序直接秒掉,如果用dp的方法去做呢?我们用第一个样例来举个例子
5 2 3
5 1 3 10 1
在这里插入图片描述
首先初始化dp[1][j] = a[j]
然后做一个max变量r r =max(r,dp[i-1][j])
dp转移方程就是dp[i][j] = dp[i-1][j-1]+a[j];之后跑一遍循环取最大值18输出就好了
——————————————————————————————————————————

好 问题来了 如果加上K你怎么搞呢?
我们要在保持最大值的同时,确定位置。所以再来看看我之前说的
------用deque+pair取第i个数时每次维护前k个数的最大值。first解决最大值,second解决每k个。

在这里插入图片描述
我们可以看到deque的front是最优子状态,一但最优解不符合k时用second<j-k pop_front,用first<=dp[i-1][j]来pop_back。

deque front后面的就是备胎当front没了它站出来
在这里插入图片描述

posted @ 2019-03-22 20:42  AlexPanda  阅读(218)  评论(0编辑  收藏  举报