码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 决策单调性优化


    [JSOI2011] 柠檬 

    题目简述:

    1.每一段的左右端点的贝壳大小一定相等,且这一段选定的贝壳一定是左右端点的贝壳大小

    2.跟据第一点写出状态转移方程:f[i]=max(f[j-1]*size[i]*cnt[ ]^{2})

    3.根据第一点也可以知道,状态转移只在相同的颜色之间转移

    优化:

    决策单调性优化是什么???四边形不等式优化 - OI Wiki

     我们日常DP的时候通常时在做的是把所有状态更新出来,每一个状态都去算,但是我们知道最优解唯一,那么我们是否可以找到从哪里开始,之后的状态一定是....才会最优?

    其次的,我们之所以学DP就是为了解决“各阶段分别贪心得到结果不一定最优”的问题,我们在这里对每一个阶段找断点是否是Fake的呢???

    《好吧优化当然是真的》但是他之所以正确是因为满足所谓的单调性。这里的单调不是指两条斜率不同的直线巴拉巴拉怎么样,而是指:

    (借用【洛谷】P5504 [JSOI2011] 柠檬(决策单调性优化dp) - 曙城 - 博客园的图qwq感谢这篇博客让我学会决策单调性优化)

     套用上上图的公式:f[i]=minD_{i}+g[i],这里的g[i]是一个二次函数,增长速率快(单调),即使红线起始时低于黑线,但是一定会在某个点超过黑线并且以后都是红线的决策更优,我们要二分查找的就是这个点在哪里。

    但是!!!看到这里,有没有觉得特别分裂???找到这个点啊然后呢?这个点往哪代啊?

    这里的纵坐标是f[~]的具体值,横坐标就是 f 的下标/kel ,更重要的是,对于每一个s[i],或者说col[i],是单独一个栈的,没办法把所有颜色放在一起进行优化!!!

    1. #include
    2. using namespace std;
    3. #define int long long
    4. int n,cnt[100010];
    5. int s[100010],f[100010],col[100010];
    6. vector<int>q[100010];
    7. #define qwq(i) q[i][q[i].size()-1]
    8. #define QWQ(i) q[i][q[i].size()-2]
    9. int calc(int j,int sum)
    10. { return f[j-1]+col[j]*sum*sum; }
    11. int merge(int x,int y)
    12. {
    13. int l=1,r=n;
    14. while(l
    15. {
    16. int mid=l+r>>1;
    17. if(calc(x,mid-s[x]+1)>=calc(y,mid-s[y]+1)) r=mid;
    18. else l=mid+1;
    19. }
    20. if(calc(x,r-s[x]+1)>=calc(y,r-s[y]+1)) return r;
    21. return n+1;
    22. }
    23. signed main()
    24. {
    25. scanf("%lld",&n);
    26. for(int i=1;i<=n;i++) scanf("%lld",&col[i]);
    27. for(int i=1;i<=n;i++) s[i]=++cnt[col[i]];
    28. for(int i=1;i<=n;i++)
    29. {
    30. while(q[col[i]].size()>1&&merge(QWQ(col[i]),qwq(col[i]))<=merge(qwq(col[i]),i))
    31. q[col[i]].pop_back();
    32. q[col[i]].push_back(i);
    33. while(q[col[i]].size()>1&&merge(QWQ(col[i]),qwq(col[i]))<=s[i])
    34. q[col[i]].pop_back();
    35. f[i]=calc(qwq(col[i]),s[i]-s[qwq(col[i])]+1);
    36. }
    37. printf("%lld",f[n]);
    38. return 0;
    39. }

    CSDNicon-default.png?t=M666https://marketing.csdn.net/p/bdabfb52c5d56532133df2adc1a728fd

  • 相关阅读:
    vue组件之间的传值方式
    POSTGRESQL中的groupping函数详解
    P44,45 属性预处理,执行后游戏效果回调,附录指定区域内修改变量
    PostgreSQL的MVCC对比Oracle的MVCC有什么优劣势?
    ElasticSearch 分布式搜索引擎
    【自然语言处理】【文本生成】Transformers中用于语言生成的不同解码方法
    MoveIt 机械臂运动 学习 01-MoveIt 初次见面
    前端架构-分层而治,铁打的MV流水的C
    【18年扬大真题】给定有m个整数的递增有序数组a和有n个整数的递减有序数组b,将a数组和b数组归并为递增有序的数组c
    Ubuntu 22.04 clang++ /usr/bin/ld: 找不到 -lstdc++: 没有那个文件或目录
  • 原文地址:https://blog.csdn.net/m0_60137414/article/details/126057597
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号