Problem Link

有一个长为 \(n\) 的排列 \(p\),给定 \(A,B\),你每次可以做以下两种操作之一:

  • 选取 \(l,r\),将 \(p[l:r]\) 循环右移,代价为 \(A\);
  • 选取 \(l,r\),将 \(p[l:r]\) 循环左移,代价为 \(B\)。

求将 \(p\) 排序所需的最小代价。\(n\le 5000\)。


技巧:循环移位 → 插入 → 实数坐标,移动

首先感觉这个循环左移右移的操作非常奇怪,用一个新的表述:循环右移即把一个数插到左边一个位置,循环左移即把一个数插到右边一个位置。这是很容易能想到的。

接下来的操作相当厉害:考虑到每个数的相对位置并不好维护,于是改成改变绝对位置!每次就是把一个数移动到一个实数的位置即可!如果往左移就花 \(A\) 的代价,如果往右移就花 \(B\) 的代价。

现在就很好 dp 啦!定义 \(f(i,j)\) 表示考虑到数 \(i\),它放的位置是 \([j,j+1)\),最小代价。前缀和优化即可做到 \(O(n^2)\)。

点击查看代码
  1. #include <bits/stdc++.h>
  2. #define For(i,a,b) for(int i=a;i<=b;i++)
  3. #define Rev(i,a,b) for(int i=a;i>=b;i--)
  4. #define Fin(file) freopen(file,"r",stdin);
  5. #define Fout(file) freopen(file,"w",stdout);
  6. using namespace std;
  7. const int N=5e3+5; typedef long long ll;
  8. int n,A,B,a[N],p[N]; ll f[N][N],tf[N][N];
  9. inline void ck(ll& x,ll y) { x>y&&(x=y); }
  10. int main(){
  11. cin>>n>>A>>B; For(i,1,n) cin>>a[i],p[a[i]]=i;
  12. memset(f,60,sizeof(f)); f[0][0]=0;
  13. For(i,1,n){
  14. For(j,0,n){
  15. if(j) ck(f[i][j],tf[i-1][j-1]+(j==p[i]?0:j<p[i]?B:A));
  16. ck(f[i][j],tf[i-1][j]+(j<p[i]?B:A));
  17. }
  18. tf[i][0]=f[i][0]; For(j,1,n) tf[i][j]=min(tf[i][j-1],f[i][j]);
  19. }
  20. cout<<tf[n][n]<<'\n';
  21. return 0;
  22. }

【dp,建模】AGC032D Rotation Sort的更多相关文章

  1. AtCoder AGC032D Rotation Sort (DP)

    题目链接 https://atcoder.jp/contests/agc032/tasks/agc032_d 题解 又是一道神仙题啊啊啊啊...atcoder题真的做不来啊QAQ 第一步又是神仙转化: ...

  2. AGC032D Rotation Sort

    题目传送门 Description 给定\(N\)的排列(\(N\leq5000\)),将任一区间最左侧的数插到该区间最右边的代价为\(A\),将任一区间最右侧的数插到该区间最左边的代价为\(B\), ...

  3. AT4519-[AGC032D]Rotation Sort【dp】

    正题 题目链接:https://www.luogu.com.cn/problem/AT4519 题目大意 给出一个长度为\(n\)的排列,每次可以选择一个区间,然后花费\(A\)的代价向左旋转(最左边 ...

  4. 那些神奇的DP建模

    (1). 迎接仪式 思路:性质,状态1拆为2,进行匹配 (2). 数字序列 思路:转换DP方程,玄学 (3). 序列分割 思路:性质,斜率优化 (4). 经营与开发 思路:倒序,秦久韶公式 (5). ...

  5. 【BZOJ-3790】神奇项链 Manacher + 树状数组(奇葩) + DP

    3790: 神奇项链 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 304  Solved: 150[Submit][Status][Discuss] ...

  6. Brackets(区间dp)

    Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3624   Accepted: 1879 Descript ...

  7. HDU 4362 Dragon Ball 贪心DP

    Dragon Ball Problem Description   Sean has got a Treasure map which shows when and where the dragon ...

  8. 怒刷DP之 HDU 1160

    FatMouse's Speed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Su ...

  9. 斜率DP题目

    uva 12524 题意:沿河有n个点,每个点有w的东西,有一艘船从起点出发,沿途可以装运东西和卸载东西,船的容量无限,每次把wi的东西从x运到y的花费为(y-x)*wi; 问把n个点的东西合并成k个 ...

  10. 树状DP

    紫皮,各种,非原创 树状数组在我的理解就是在决策过程中具有层次关系,像是树一样,具有上下级关系或者上级对上级一定程度的限制条件 uva 12186 工人的请愿书 下属中不小于 T% 的人签字时会签字递 ...

随机推荐

  1. 手把手教你写一个spring IOC容器

    摘要:spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了spring容器对依赖的全局控制.今天就带大家 ...

  2. U2Net基于ModelArts Notbook的仿真实验

    摘要:U2Net是一个优秀的显著性目标检测算法,由Qin Xuebin等人发表在Pattern Recognition 2020期刊[Arxiv].U2Net名称的来源在于其网络结构由两层嵌套的Une ...

  3. 想提高运维效率,那就把MySQL数据库部署到Kubernetes 集群中

    摘要:Kubernetes 很多看起来比较"繁琐"的设计的主要目的,都是希望为开发者提供更多的"可扩展性",给使用者带来更多的"稳定性"和& ...

  4. Spark 覆盖写Hive分区表,只覆盖部分对应分区

    要求Spark版本2.3以上,亲测2.2无效 配置 config("spark.sql.sources.partitionOverwriteMode","dynamic& ...

  5. 【eBPF-04】进阶:BCC 框架中 BPF 映射的应用 v2.0——尾调用

    这两天有空,继续更新一篇有关 eBPF BCC 框架尾调用的内容. eBPF 技术很新,能够参考的中文资料很少,而对于 BCC 框架而言,优秀的中文介绍和教程更是凤毛麟角.我尝试去网上检索有关尾调用的 ...

  6. vue3引入使用svg图标

    vue3使用svg图标 安装 // 通过命令安装2个插件 npm i vite-plugin-svg-icons -D npm i fast-glob -D 在vue.config.js中配置 //v ...

  7. 在Winform系统开发中,对表格列表中的内容进行分组展示

    在我们开发Winform界面的时候,有时候会遇到需要对一些字段进行一些汇总的管理,如果在列表中能够对表格列表中的内容进行分组展示,将比较符合我们的预期,本篇随笔介绍在Winform开发中如何利用Dev ...

  8. idea创建父子项目

    1. 首先创建大的project 父工程:  2. 点击下一步之后: 3. 点击下一步,填写项目存放地址,点击finish: 4. 完成之后删除不需要的文件,保留pom文件,检查对应的jar和spri ...

  9. 二、docker的安装和镜像管理

    系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...

  10. vue 使用print.js实现前端打印功能

    https://blog.csdn.net/cccdf_jjj/article/details/99563682 插件vue-print-nb实现前端打印当前页面功能 https://blog.csd ...