码农知识堂 - 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

  • 相关阅读:
    avue 字典联动 cascader、cascaderItem
    【分享】“有赞商城“ 在集简云平台集成应用的常见问题与解决方案
    哪种蓝牙耳机降噪好?适合国庆假期使用的蓝牙耳机推荐
    Java并发面试题:(五)volatile关键字
    基于Qt QList和QMap容器类示例
    【通信原理】确知信号的性质分析与研究
    神经网络 深度神经网络,深度神经网络通俗理解
    [论文评析]Single Image Haze Removal Using Dark Channel Prior
    “MIME 媒体类型“用来标识网络传输内容的格式标准
    【微信读书】数据内容接口逆向调试02
  • 原文地址:https://blog.csdn.net/m0_60137414/article/details/126057597
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号