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. 物联网设备上云难?华为云IoT帮你一键完成模型定义,快速在线调试设备

    摘要:在不到3分钟的操作里,不仅完成了一款智慧烟感设备在云端的模型定义,还通过在线调试了解到了设备和远端通信的过程. 本文分享自华为云社区<物联网设备上云难?华为云IoT帮你一键完成模型定义,快 ...

  2. JS遍历循环方法性能对比:for/while/for in/for of/map/foreach/every

    这周codeReview例会,又遇到map与foreach到底谁问题.单独图方便,我会选择用map一个函数搞定一切.但是从语义的角度来讲,如果只是单纯遍历,还是推荐选择foreach.其实formap ...

  3. 基于AIO架构smarthttp开发的完整MVC框架

    基于AIO架构smarthttp开发的完整MVC框架 写了篇<基于jdk自带httpserver开发的最小完整MVC框架>,就再写篇AIO的MVC DEMO启动时间:0.1s(应该算少的吧 ...

  4. WCF 动态调用 动态代理

    关键词:WCF动态调用.动态调用WCF.WCF使用动态代理精简代码架构.使用反射执行WCF接口 代码地址: https://gitee.com/s0611163/DynamicWCF https:// ...

  5. 【每日一题】32. 比赛 (DFS / 概率DP)

    补题链接:Here [方案一:DFS] 首先我们可以计算出每道题做不出来的概率 \(unsolve[i] = (1 - a[i])(1- b[i])(1 - c[i])\) 然后因为只有 12 道题, ...

  6. S3C2440移植uboot之支持DM9000

      上一节S3C2440移植uboot之支持NANDFLASH操作移植了uboot 支持了NANDFLASH的操作,这一节修改uboot支持DM9000. 目录 通过Makefile把dm9000x编 ...

  7. 开发中history和location

  8. 堆和栈:JS数据怎么存储的?

    JS数据存储主要分堆和栈两种, 栈空间:通常情况栈空间不会设置太大,主要用来存放一些原始类型的小数据,原始类型的数据有:Boolean.Null.Undefined.Number.BigInt.Str ...

  9. freeswitch-1.10.7 on centos7编译安装

    概述 最近由于项目需求,老版本的fs已经不适用,特此升级了freeswitch的版本,使用当前最新的1.10.7版本编译安装. 环境 centos:CentOS  release 7.0 (Final ...

  10. C# 排序算法5:归并排序

    归并排序,是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列.该算法是采用分治法. 原理: 1.申请空间,使其大小为两个已经排序 ...