题目链接

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. AT4519-[AGC032D]Rotation Sort【dp】

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

  2. AtCoder AGC043D Merge Triplets (DP、组合计数)

    题目链接 https://atcoder.jp/contests/agc043/tasks/agc043_d 题解 考场上想到正确做法,然后思考实现细节的时候做法逐渐扭曲,最后GG--考后睡了一觉冷静 ...

  3. AtCoder AGC004E Salvage Robots (DP)

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

  4. AtCoder AGC009E Eternal Average (DP)

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

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

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

  6. 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 ...

  7. Atcoder ARC101 E 树dp

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

  8. AtCoder Beginner Contest 266(C- G)「判凸包」「dp」「期望」「基环树」「组合数」

    abc好好好. C - Convex Quadrilateral (atcoder.jp) 思路: 判凸包,向量叉积×=|a|*|b|*sin.叉积<0即角>180°. (可以勉勉强强算我 ...

  9. HDU - 5242 Game(树形dp+树链剖分/树上贪心+思维)

    题目链接:点击查看 题目大意:给出一棵包含n个节点的树,每个节点都有一个权值,整棵树的根是点1,问从点1开始向下一直走到叶子节点,可以走k次,怎么样走权值和最大,每个节点被走过一次后权值会变为0 题目 ...

最新文章

  1. Linux拥有良好的界面
  2. 干货丨史上最好记的神经网络结构速记表(经典资源,值得收藏)
  3. 心血来潮学python
  4. 玩转java(Android)注解
  5. mysql 12安装教程下载_MySQL 8.0.12.0安装教程
  6. python PIL.Image使用
  7. 使用PowerShel导入和导出Hyper-v虚拟机
  8. git之windows下创建.gitignore文件
  9. 使用vue element-ui 打印组件
  10. 职称计算机考试f11,2016全国职称计算机考试PowerPoint单选试题3
  11. 计算机一级B考试总结500字,第一次月考总结与反思500字
  12. Android ActivityManagerService (AMS)总结
  13. Vue开发仿京东商场app
  14. 通过路由器访问光猫(openwrt)
  15. LBP算法的研究及其实现
  16. 003_JS实现图片轮播与点击播放
  17. 如何理解假设检验中的假设设计?
  18. 格局是什么意思「简单易懂」
  19. 【线性模型引论】王松桂著 课后习题3.3参考答案
  20. GIS学习二:地形分析

热门文章

  1. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170411
  2. 重磅 | 吴恩达新书《Machine Learning Yearning》1-52 最新章节分享
  3. 命主属性是水什么意思_涧下水命是什么水 涧下水命的含义(图文)
  4. 点击表格获取列索引的方法
  5. powerdesigner自动生成代码的修改
  6. 增加话务系统功能感想
  7. Linux CPU cache
  8. spring源码研究
  9. Linux chmod命令小贴士
  10. 使用nginx动静分离后,druid被拦截的解决方法