AT4519-[AGC032D]Rotation Sort【dp】
正题
题目链接:https://www.luogu.com.cn/problem/AT4519
题目大意
给出一个长度为\(n\)的排列,每次可以选择一个区间,然后花费\(A\)的代价向左旋转(最左边的丢到最右边)或者花费\(B\)的代价向右旋转。
排升序序的最小花费。
\(1\leq n\leq 5000\)
解题思路
相当于向右丢和向左丢。因为位置不固定非常麻烦,我们可以考虑统计那些顺序固定的。
设\(f_i\)表示做到第\(i\)个且第\(i\)个不动的最小花费,然后考虑\(f_j\)转移到\(f_i\)时的代价,那么显然我们要把中间数都变成在\(a_j\)到\(a_i\)之间,所以把其中所有大于\(a_i\)的往右丢,小于\(a_j\)的往左丢。
这样可以做到\(O(n^3)\)或者用数据结构做到\(O(n^2\log n)\)
但是我们考虑到小于\(a_j\)的同时也是小于\(a_i\)的,如果我们把所有小于\(a_i\)的都往左丢,这样不会出现更小的答案,所以不会被统计到里面。
这样就只和\(a_i\)有关了,倒序枚举\(j\)然后\(O(n^2)\)转移即可。
用线段树可以做到\(O(n\log n)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5100;
ll n,A,B,a[N],f[N];
signed main()
{
scanf("%lld%lld%lld",&n,&A,&B);
for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
memset(f,0x3f,sizeof(f));
a[0]=-1;++n;a[n]=n;f[0]=0;
for(ll i=1;i<=n;i++){
ll up=0,dn=0;
for(ll j=i-1;j>=0;j--){
if(a[j]<a[i])f[i]=min(f[i],f[j]+up*A+dn*B);
if(a[j]>a[i])up++;else dn++;
}
}
printf("%lld\n",f[n]);
}
AT4519-[AGC032D]Rotation Sort【dp】的更多相关文章
- POJ_2533 Longest Ordered Subsequence【DP】【最长上升子序列】
POJ_2533 Longest Ordered Subsequence[DP][最长递增子序列] Longest Ordered Subsequence Time Limit: 2000MS Mem ...
- LeetCode:零钱兑换【322】【DP】
LeetCode:零钱兑换[322][DP] 题目描述 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成 ...
- Kattis - honey【DP】
Kattis - honey[DP] 题意 有一只蜜蜂,在它的蜂房当中,蜂房是正六边形的,然后它要出去,但是它只能走N步,第N步的时候要回到起点,给出N, 求方案总数 思路 用DP 因为N == 14 ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDOJ 1257 最少拦截系统 【DP】
HDOJ 1257 最少拦截系统 [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- HDOJ 1159 Common Subsequence【DP】
HDOJ 1159 Common Subsequence[DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- HDOJ_1087_Super Jumping! Jumping! Jumping! 【DP】
HDOJ_1087_Super Jumping! Jumping! Jumping! [DP] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- HackerRank - common-child【DP】
HackerRank - common-child[DP] 题意 给出两串长度相等的字符串,找出他们的最长公共子序列e 思路 字符串版的LCS AC代码 #include <iostream&g ...
随机推荐
- Centos7 出现Welcome to emergency mode!【紧急模式】
Centos7 出现Welcome to emergency mode![紧急模式] 做mount挂载时,修改了 /etc/fstab 文件,导致Centos7重启时出现如下图所示错误: 输入r ...
- 解决servlet中get方式中中文乱码问题前驱(一):装饰者模式再理解
package day02; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; ...
- Python中的列表、元组、字典、字符串及切片操作
我们引入一个新的概念:数据结构 数据结构是通过某种方式组织在一起的数据元素的集合,这些数据元素可以是数字或字符,甚至可以是其他数据结构,在python中,最基本的数据结构是序列,序列中的每个元素匾被分 ...
- springMVC学习总结(一) --springMVC搭建
springMVC学习总结(一) --springMVC搭建 搭建项目 1.创建一个web项目,并在项目中的src文件夹下创建一个包com.myl.controller. 2.添加相应jar包 3.在 ...
- shell脚本书写
#!/bin/bash #指定脚本默认使用的命令解释器 第1行 幻数 #!/usr/bin/python #!/bin/awk #!/bin/sed
- C++11多线程编程
1. 多线程编程 在进行桌面应用程序开发的时候, 假设应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作.这种情况下就需要使用多线程,其中一 ...
- 一行Java代码实现游戏中交换装备
摘要:JDK 1.5 开始 JUC 包下提供的 Exchanger 类可用于两个线程之间交换信息. 本文分享自华为云社区<一行Java代码实现两玩家交换装备[并发编程]>,作者:陈皮的Ja ...
- python库--tensorflow--数学函数
官方API(需FQ) 中文API 方法 返回值类型 参数 说明 算数运算符 .add() Tensor x, y, name=N 加法(若x,y都为tensor, 数据类型需一致, 以下所有x,y都如 ...
- 关于JDK高版本下RMI、LDAP+JNDI bypass的一点笔记
1.关于RMI 只启用RMI服务时,这时候RMI客户端能够去打服务端,有两种情况,第一种就是利用服务端本地的gadget,具体要看服务端pom.xml文件 比如yso中yso工具中已经集合了很多gad ...
- Vue组件传值(一)之 父子之间如何传值
Vue中组件之间是如何实现通信的? 1.父传子: 父传子父组件通过属性进行传值,子组件通过 props 进行接受: 1 父组件中: 2 3 <template> 4 <div id= ...