首页 > 其他分享 >Solution Set 2023.12.13

Solution Set 2023.12.13

时间:2023-12-13 16:24:22浏览次数:30  
标签:std 13 Set MIN 2023.12 valueType typedef ValueVector le

CF1736E Swap and Take

设在第 \(i\) 次操作后产生贡献的值为初始序列的 \(a_{p_i}\),可以发现产生的贡献的指针移动方式为每次向后移动 \(1\),而通过交换数字最多可以使得某个数字每次向后移动 \(1\),由此可以得出每次产生贡献的位置单调不减,即 \(p_1 \le p_2 \le \cdots \le p_n\)。

这样若某次操作后的贡献点位置为 \(k_0\),那么对于这之后的所有操作的贡献点 \(k\),均有 \(k_0 \le k\),而在最优策略下,若 \(k_0\) 产生贡献一定不会影响到 \(k_0\) 之后的位置,因此决策不具有后效性,可以进行 \(\tt{DP}\)。

设 \(f_{i, j, k}\) 表示在进行了 \(j\) 次操作后 \(a_k\) 在第 \(i\) 个位置产生了贡献的情况下最大的分数值,转移考虑 \(p_i\) 与 \(p_{i - 1}\) 之间的关系

  • 若 \(p_{i - 1} = p_i\),那么有 \(f_{i, j, k} \leftarrow f_{i - 1, j - 1, k} + a_k\)
  • 若 \(p_{i - 1} \le p_i\),通过枚举 \(p_{i - 1}\) 的值可以实现转移,有 $$f_{i, j, k} = \max\limits_{1 \le k^{\prime} < k} f_{i - 1, j - \left(k - i\right), k^{\prime}} + a_k$$,通过前缀最大值优化即可实现 \(\mathcal{O}(1)\) 转移。

总复杂度 \(\mathcal{O}(N^3)\),可以通过。

Code
#include <bits/stdc++.h>

typedef int valueType;
typedef std::vector<valueType> ValueVector;
typedef std::vector<ValueVector> ValueMatrix;
typedef std::vector<ValueMatrix> ValueCube;

constexpr valueType MIN = std::numeric_limits<valueType>::min() >> 1;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    valueType N;

    std::cin >> N;

    ValueVector A(N + 1);

    for (valueType i = 1; i <= N; ++i)
        std::cin >> A[i];

    ValueCube F(N + 1, ValueMatrix(N + 1, ValueVector(N + 1, MIN))), G(N + 1, ValueMatrix(N + 1, ValueVector(N + 1, MIN)));

    G[0][0][0] = F[0][0][0] = F[0][0][1] =0;

    for (valueType k = 1; k <= N; ++k)
        G[0][0][k] = std::max(G[0][0][k - 1], F[0][0][k]);

    for (valueType i = 1; i <= N; ++i) {
        for (valueType j = 0; j <= i; ++j) {
            for (valueType k = 1; k <= N; ++k) {
                if (j > 0)
                    F[i][j][k] = std::max(F[i][j][k], F[i - 1][j - 1][k] + A[k]);

                if (j >= k - i && k >= i)
                    F[i][j][k] = std::max(F[i][j][k], G[i - 1][j - (k - i)][k - 1] + A[k]);

                G[i][j][k] = std::max(G[i][j][k - 1], F[i][j][k]);
            }
        }
    }

    valueType ans = MIN;

    for (valueType j = 0; j <= N; ++j)
        for (valueType k = 1; k <= N; ++k)
            ans = std::max(ans, F[N][j][k]);

    std::cout << ans << std::endl;
}

标签:std,13,Set,MIN,2023.12,valueType,typedef,ValueVector,le
From: https://www.cnblogs.com/User-Unauthorized/p/2023-12-13.html

相关文章

  • vulkan/descriptorSet
    参考Shaderlayout(binding=0)uniformUniformBufferObject{mat4model;mat4view;mat4proj;}ubo;layout(location=0)invec2inPosition;layout(location=1)invec3inColor;layout(location=2)invec2inTexCoord;layout(location=0)......
  • 20231213matlab问题资料汇总
    https://bbs.csdn.net/topics/390064770https://www.ilovematlab.cn/forum.php?mod=viewthread&tid=455375&_dsign=7812fb23https://blog.csdn.net/fmber/article/details/85858771https://www.mathworks.com/help/dotnetbuilder/MWArrayAPI/html/T_MathWorks_MATL......
  • 【交叉链表】Java哈希表——HashSet类/双指针
    leetcode160.相交链表题意:给定两个链表A、B的表头节点,找到链表交叉节点(地址值相同)。链表A长度为m,链表B长度为n,范围在[1,3e4]题解1:根据哈希表去重的原理,使用哈希表集合HashSet来维护链表节点,默认比较节点地址值。将链表A中的节点全部add进HashSet中,然后遍历链表B中的节点,如果......
  • springboot+vue小白升级之路13-AOP实现登录、增删改查操作日志管理
    还是接着上一个的内容,我把这个新增的关于日志的功能代码都贴出来,供大家学习参考。数据库数据库droptableifexistsan_log;createtablean_log( idintnotnullauto_incrementprimarykeycomment'主键id', namevarchar(255)notnullcomment'操作内容', log_dateda......
  • Vue3 setup 方法的一些基本使用总结
    官网介绍:https://cn.vuejs.org/api/composition-api-setup.html基本使用setup()钩子是在组件中使用组合式API的入口,通常只在以下情况下使用:需要在非单文件组件中使用组合式API时。需要在基于选项式API的组件中集成基于组合式API的代码时。setup方法返回值:返回一......
  • 2023-12-13 晚上听课的一点重要记录。 目标 和 感受 分开
    2023-12-13  目标和感受分开。改变习惯去实现目标,有时候就是很难受的事。一边难受着一边做。人家改变的时候,哭两个小时,接着干,干一个小时,又继续哭两个小时,又继续干。就是这样过来的。难受就难受着干。  父母是平凡的,我是平凡的,孩子是平凡的。  善恶不一定。并不......
  • 2023-12-13 自我而绝的想法反思
    2023-12-13   小时候就觉得,活着真苦啊,既然这样把我生下来干嘛。我不能再把这个苦一代代的传递下去了。   父母的血脉传承自此就自我而绝了。自己都过得不好,生个孩子,就能让他过好了?既然给不了,那干嘛要生。起码也要把自己搞好了,然后再来想生不生的事。   最近想法......
  • STM32学习随笔 12.13
    慢摸摸的学习之前跟着B站江协科技UP学51感觉没啥,学到STM32就感觉很吃力,又想钻研清楚,看到定时器TIM章节零零总总差不多耽搁快进一个月了总结下近期学到的东西学习掌握多元条件运算符,这样可以省略很多if()else()或者switch()case;语句示例:      i-=(i>10000)?10......
  • 2023.12 ~ After the ice turns into water / the sea I hang upside down will be yo
    COCI2023.11LOJ3999考虑把填数过程倒过来做,那么就变成了覆盖。设\(f(i,j,0/1)\)表示目前填进去\(i\)个数,且最后一个填的数是\(j\),并且\(j\)的位置在最左侧/最右侧的方案数。以\(f(i,j,0)\)为例,转移有:\(f(i,j,0)\tof(i+1,k,0)\),要求\(k\lej-1\)且\(j-1\equivk......
  • 2023年12月13日 闲言碎语
    一晃过了好久,也可以说恍如隔世,后头看最近几个月,甚至这几年发生的事情,过的好快。多乐都四个月了(我家的男宝)。本想在期货中大展拳脚,最终却亏得畏手畏脚,准备离场了,亏钱不一定是坏事情,万事看的角度不一样。最近我迷茫了,找不清方向,再一次回到的之前的节点,很迷茫很迷茫,本以为抓住了翻......