题目传送门

Description

给定\(N\)的排列(\(N\leq5000\)),将任一区间最左侧的数插到该区间最右边的代价为\(A\),将任一区间最右侧的数插到该区间最左边的代价为\(B\),问将该排列排为升序的最小代价。

Solution

显然有一个\(O(n^3)\)的区间\(dp\)方法,但与正解无关。

考虑操作的实际效果,其实就是将一个数向前或后移,并不需要管它移到哪里,因为所有数都向任一方向移动就一定能到达升序。

所以我们只要考虑没有移动的位置,设\(dp_{i,j}\)为考虑前\(i\)个数,前\(i\)个钟最后一个没有移动的数为\(j\)的最小代价,分\(a_i>j\)及\(a_i<j\)转移即可。

细节见代码:

#include<cstdio>
#include<cstring>
#define int long long
#define rep(i, a, b) for (register int i=(a); i<=(b); ++i)
#define per(i, a, b) for (register int i=(a); i>=(b); --i)
using namespace std;
typedef long long ll;
inline void chkmax(int &x, int y){x<y?(x=y):0;}
inline void chkmin(int &x, int y){x>y?(x=y):0;}
const int N=5005;
int dp[N][N], a[N]; inline int read()
{
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
} signed main()
{
int n=read(), A=read(), B=read(), ans=1ll<<60;
rep(i, 1, n) a[i]=read();
memset(dp, 0x3f, sizeof(dp)); dp[0][0]=0;
rep(i, 1, n) rep(j, 0, n)
if (a[i]>j)
chkmin(dp[i][j], dp[i-1][j]+A),
chkmin(dp[i][a[i]], dp[i-1][j]);
else
chkmin(dp[i][j], dp[i-1][j]+B);
rep(i, 0, n) chkmin(ans, dp[n][i]);
printf("%lld\n", ans);
return 0;
}

最新文章

  1. 支持coclock模式
  2. C语言小练习二
  3. Grid – 入门必备!简单易懂的响应式设计指南
  4. Objective-C
  5. PHP经验集锦
  6. 以前写过的一些oracle语句
  7. HBuilder打包App方法
  8. 201521123022 《Java程序设计》 第五周学习总结
  9. Java眼中的XML--------文件读取
  10. tree、find、tail命令重要实战
  11. Android开发基础规范(一)
  12. Zabbix中获取各用户告警媒介分钟级统计
  13. php post和get请求
  14. 項目当中使用的easyui的模板crud页面
  15. k8s sidecar, Ambassador, Adapter containers
  16. windows下定时任务设置
  17. 《C》数组
  18. python全栈开发从入门到放弃之socket并发编程之协程
  19. C#制作ActiveX浏览器插件.net
  20. 洛谷 P1516 青蛙的约会 解题报告

热门文章

  1. yii创建与设置默认控制器并载入模板
  2. Nginx 分析access日志文件
  3. 原生JS获取url汇总
  4. QFileInfo
  5. Debian Buster 配置 Laravel 运行环境(nginx + redis + supervisor)
  6. Jmeter发送某个request时而成功,时而失败(处理办法:失败的时候尝试重新发送这个HTTP request)
  7. 将C语言宏定义数值转换成字符串!
  8. MVC--SSM和SSH简介
  9. CentOS7查看网络的相关命令
  10. webuploader传递参数