zoukankan      html  css  js  c++  java
  • 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没了它站出来
    在这里插入图片描述

    人一我百,人十我万。
  • 相关阅读:
    web前端工程师
    java工程师
    原因原来默认预检测会检测是否存在多选框
    软件测试&安全测试高峰论坛
    安卓学习图
    为什么mongo中不能用int作为key
    历经小半宿吧。哎,终于搭建好了Linux-C的环境
    把昨晚写的东西完善了一下,还行,真差不多
    半宿了,仿写了个CList模板类,留着以后用吧
    今天复习了一下完成端口网络模型
  • 原文地址:https://www.cnblogs.com/AlexPanda/p/12520346.html
Copyright © 2011-2022 走看看