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. 云小课|MRS基础原理之CarbonData入门

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:CarbonDat ...

  2. 云小课 | 华为云KYON之L2CG

    摘要:本文介绍KYON独创的L2CG,打通大二层网络,支持企业携带私网IP直接上云,让业务敏捷迁移,大幅降低企业上云的复杂度和成本.同时支持虚拟机粒度迁移,让企业上云过程中无需迁移整个子网. 本文分享 ...

  3. 详解openGauss多线程架构启动过程

    摘要:本文介绍openGauss数据库的启动过程,包括主线程,辅助线程及业务处理线程的启动过程. 本文分享自华为云社区<openGauss内核分析(一):openGauss 多线程架构启动过程详 ...

  4. Python图像处理丨图像缩放、旋转、翻转与图像平移

    摘要:本篇文章主要讲解Python调用OpenCV实现图像位移操作.旋转和翻转效果,包括四部分知识:图像缩放.图像旋转.图像翻转.图像平移. 本文分享自华为云社区<[Python图像处理] 六. ...

  5. PS组件相关BAPI

    一.新增组件BAPI "-----------------------------------------@斌将军-------------------------------------- ...

  6. 【3rd_Party】使用QuaZip进行压缩和解压缩文件

    QuaZIP使用记录 官方文档 一.QuaZIP是什么 QuaZIP is a simple C++ wrapper over Gilles Vollant's ZIP/UNZIP package t ...

  7. linux 查看服务器cpu 与内存配置

    转载请注明出处: 1. 通过 lscpu 命令查看 服务器的cpu 配置 显示格式: Architecture: #架构 CPU(s): #逻辑cpu颗数 Thread(s) per core: #每 ...

  8. CoreDNS -- DNS服务与服务发现

    CoreDNS -- DNS服务与服务发现 DNS服务器 手册:https://coredns.io/manual/toc/ Github:https://github.com/coredns/cor ...

  9. MySQL 8.2.0部署安装验证

    MySQL 8.2.0部署安装验证 背景 昨天捯饬了半天Oracle23c Free版本发现自己白忙活了. 然后想着继续看一下 MySQL8.2. 看看会不会又继续白忙活 下载与安装 https:// ...

  10. Harbor修改默认网段以及设置开机启动的方法

    Harbor修改默认网段以及设置开机启动的方法 背景 docker 默认的网段是 172.16.xx.xx 网段. harbor进行设置时会自动加1 设置为 172.17.xx.xx 有时候这个网段是 ...