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)\)。

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

【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. Spark 开源新特性:Catalyst 优化流程裁剪

    摘要:为了解决过多依赖 Hive 的问题, SparkSQL 使用了一个新的 SQL 优化器替代 Hive 中的优化器, 这个优化器就是 Catalyst. 本文分享自华为云社区<Spark 开 ...

  2. MRS HetuEgine的数据虚拟化实践

    摘要:华为MRS云原生数据湖平台的HetuEngine就是一款解决大数据时代跨源跨域问题的数据虚拟化引擎. 本文分享自华为云社区<基于华为云原生数据湖MRS HetuEgine的数据虚拟化实践& ...

  3. Solon 运行出乱码怎么办?

    1.启动时添加 -Dfile.encoding=utf-8,示例: java -Dfile.encoding=utf-8 -jar DemoApp.jar 再出现乱码?一般是文件本身编码问题.检查一下 ...

  4. CountDownLatch、CyclicBarrier 使用区别

    主要区别 CountDownLatch:所有子线程完成后,再执行主线程 CyclicBarrier: 所有子线程就绪后,再执行子线程 CountDownLatch 所有子线程完成后,再执行主线程 多线 ...

  5. ElasticSearch 实现分词全文检索 - filter查询

    目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...

  6. Oracle 删除唯一约束

    1.查出有哪些约束 SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS FROM USER_CONSTRAINTS WHERE TABLE_NAME ='D_D ...

  7. TCP 拥塞控制对数据延迟的影响

    哈喽大家好,我是咸鱼 今天分享一篇文章,是关于 TCP 拥塞控制对数据延迟产生的影响的.作者在服务延迟变高之后进行抓包分析,结果发现时间花在了 TCP 本身的机制上面:客户端并不是将请求一股脑发送给服 ...

  8. 字符串匹配算法:Horspool算法

    Horspool 字符串匹配算法对Boyer-Moore算法的简化算法. Horspool 算法是一种基于后缀匹配的方法,是一种"跳跃式"匹配算法,具有sub-linear亚线性时 ...

  9. Serverless Devs 重大更新,基于 Serverless 架构的 CI/CD 框架:Serverless-cd

    近日,Serverless 开发者平台 Serverless Devs 重磅发布基于 Serverless 架构的轻量级 CI/CD 框架--Serverless-cd.Serverless-cd 是 ...

  10. C++ 覆盖写文件

    写文件有三种模式: 截断写,文件打开之后立即清空原有内容 附加写,文件打开之后不清空原有内容,每次只能在文件最后写入 覆盖写,文件打开之后不清空原有内容,可以在文件任意位置写入 例如:文件原有内容为 ...