题目链接

https://atcoder.jp/contests/agc032/tasks/agc032_d

题解

又是一道神仙题啊啊啊啊。。。atcoder题真的做不来啊QAQ

第一步又是神仙转化: 对于把第一个挪到最后其他左移这件事情,可以转化为把第一个挪到最后和最后的下一个之间的某个位置(非整数),右移同理。

于是问题就变成了: 有\(N\)个数一开始每个数有个位置,现在可以花\(A\)的代价把一个数往右移到任意位置(不一定非是整数),\(B\)的代价把一个数往左移到任意位置,然后求将它们排序的最小代价和!

这个东西又是一个简单的dp,设\(dp[i][j]\) (\(0\le j\le n\))表示前\(i\)个数排好序,第\(i\)个放在区间\([j,j+1)\)内的最小代价,转移非常容易(注意要对不移动的情况单独考虑),前缀和优化,时间复杂度\(O(N^2)\).

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
#include<algorithm>
#define llong long long
using namespace std; inline int read()
{
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x;
return -x;
} const int N = 5000;
const llong INF = 10000000000000000ll;
int p[N+3],pp[N+3];
llong dp[N+3][N+5],sdp[N+3][N+5];
int n; llong arga,argb; void update(llong &x,llong y) {x = x<y?x:y;} int main()
{
scanf("%d%lld%lld",&n,&arga,&argb);
for(int i=1; i<=n; i++) {scanf("%d",&p[i]); pp[p[i]] = i;}
for(int i=0; i<=n; i++) for(int j=0; j<=n; j++) dp[i][j] = sdp[i][j] = INF;
for(int i=0; i<=n; i++) sdp[0][i] = dp[0][i] = 0ll;
for(int i=1; i<=n; i++)
{
for(int j=0; j<=n; j++)
{
if(j==pp[i]) {update(dp[i][j],sdp[i-1][j-1]);}
llong tmp = sdp[i-1][j]+(j<pp[i]?argb:arga);
update(dp[i][j],tmp);
// printf("dp[%d][%d]=%lld\n",i,j,dp[i][j]);
}
sdp[i][0] = dp[i][0];
for(int j=1; j<=n; j++) sdp[i][j] = min(sdp[i][j-1],dp[i][j]);
}
llong ans = sdp[n][n];
printf("%lld\n",ans);
return 0;
}

AtCoder AGC032D Rotation Sort (DP)的更多相关文章

  1. AGC032D Rotation Sort

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

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

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

  3. HDU 1160 FatMouse's Speed (sort + dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160 给你一些老鼠的体重和速度,问你最多需要几只可以证明体重越重速度越慢,并输出任意一组答案. 结构体 ...

  4. AtCoder AGC001E BBQ Hard (DP、组合计数)

    题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_e 题解: 求\(\sum^n_{i=1}\sum^n_{j=i+1} {A_i+A_j+B ...

  5. AtCoder AGC004E Salvage Robots (DP)

    题目链接 https://atcoder.jp/contests/agc004/tasks/agc004_e 题解 本题的难度不在于想到大体思路,而在于如何把代码写对.. 首先我们可以不让机器人动,让 ...

  6. AtCoder AGC009E Eternal Average (DP)

    题目链接 https://atcoder.jp/contests/agc009/tasks/agc009_e 题解 又被劝退了... 第一步转化非常显然: 就等价于一开始有一个数\(1\), 有\(\ ...

  7. Atcoder ARC101 E 树dp

    https://arc101.contest.atcoder.jp/tasks/arc101_c 题解是也是dp,好像是容斥做的,但是看不懂,而且也好像没讲怎么变n^2,看了写大佬的代码,自己理解了一 ...

  8. AtCoder AGC002F Leftmost Ball (DP、组合计数)

    题目链接: https://atcoder.jp/contests/agc002/tasks/agc002_f 题解: 讲一下官方题解的做法: 就是求那个图(官方题解里的)的拓扑序个数,设\(dp[i ...

  9. hdu 4001 To Miss Our Children Time( sort + DP )

    To Miss Our Children Time Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Jav ...

随机推荐

  1. ASP.NET Core WebApi使用Swagger生成API说明文档【特性版】

    ⒈新建ASP.NET Core WebAPi项目 ⒉添加 NuGet 包 Install-Package Swashbuckle.AspNetCore ⒊Startup中配置 using System ...

  2. Entity Framework常用方法及案例

    ⒈Skip(int count) 说明:跳过集合的前n个元素:延迟.即我们跳过给定的数目返回后面的结果集. ⒉Take(int count) 说明:获取集合的前n个元素:延迟.即只返回限定数量的结果集 ...

  3. 最大矩阵覆盖权值--(静态连续最大子段 (线段树) )-HDU(6638)Snowy Smile

    这题是杭电多校2019第六场的题目 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6638 题意:给你平面上n个点,每个点都有权值(有负权),让你计算一 ...

  4. java网络编程+通讯协议的理解

    参考: http://blog.csdn.net/sunyc1990/article/details/50773014 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很 ...

  5. ASP.NET Core WebAPI帮助页--Swagger简单使用1.0

    1.什么是Swagger? Swagger是一个规范且完整的框架,提供描述.生产.消费和可视化RESTful API,它是为了解决Web API生成有用文档和帮助页的问题.   2.为啥选用swagg ...

  6. 使用 SignalR 实现推送功能

    百度搜索:使用 SignalR 实现推送功能

  7. Java异常try里面有return,finally代码会执行吗

    try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后? 肯定会执行.finally{}块的代码只有在try{} ...

  8. JAVA GUI设

    1.两种设置大小的方式: //Border border1=BorderFactory.createEmptyBorder(20,20,20,20); //设置大小        panel.setB ...

  9. mysql innodb存储引擎 锁 事务

    以下内容翻译自mysql5.6官方手册. InnoDB是一种通用存储引擎,可平衡高可靠性和高性能.在MySQL 5.6中,InnoDB是默认的MySQL存储引擎.除非已经配置了不同的默认存​​储引擎, ...

  10. linux下redis 安装

    --获取redis [redis@localhost ~]$ wget http://download.redis.io/releases/redis-2.8.7.tar.gz --2017-05-2 ...