CF704B Ant Man (插入型 dp)

CF704B Ant Man

插入型 dp

分析排列的权值,如果排列确定,那么每个位置都有自己的贡献,并且无关其他位置的贡献。考虑 dp。从小到大将 pi 插入序列中,此时序列会分成若干段,可设 fi,j 插入了 1i,序列分成 j 段的权值和。

转移通常有四种。

  1. 插入到一段的左边,此时 i 左右的大小情况确定,下面同理,于是可以转移 fi,j=max(fi,j,fi1,j+bi+ci)
  2. 插入到一段的右边,fi,j=max(fi,j,fi1,j+ai+di)
  3. 将两段合并为一段,fi,j=max(fi,j,fi1,j+1+2×xi+ai+ci)
  4. 建新的一段,fi,j=max(fi,j,fi1,j12×xi+bi+di)

考虑限制 se,如果 i=s/e,那么不需要转移所有。还有一些特殊情况,如果 i>max(s,e) 并且此时 j=1,那么无法合并;如果 i>sj=1,那么无法插入到左边;右边同理。

复杂度 O(n2)

typedef long long i64;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 5e3 + 10;
int n, s, e;
i64 x[N], a[N], b[N], c[N], d[N], f[N][N];
void Solve() {
	std::cin >> n >> s >> e;
	for(int i = 1; i <= n; i++) std::cin >> x[i];
	for(int i = 1; i <= n; i++) std::cin >> a[i];
	for(int i = 1; i <= n; i++) std::cin >> b[i];
	for(int i = 1; i <= n; i++) std::cin >> c[i];
	for(int i = 1; i <= n; i++) std::cin >> d[i];
	memset(f, 0x3f, sizeof(f));
	f[0][0] = 0;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= i; j++) {
			if(i == s) {
				f[i][j] = std::min(f[i][j], f[i - 1][j] + x[i] + c[i]);
				f[i][j] = std::min(f[i][j], f[i - 1][j - 1] - x[i] + d[i]);
			} else if(i == e) {
				f[i][j] = std::min(f[i][j], f[i - 1][j] + x[i] + a[i]);
				f[i][j] = std::min(f[i][j], f[i - 1][j - 1] - x[i] + b[i]);
			} else {
				if(!(i > s && i > e && j <= 2)) f[i][j] = std::min(f[i][j], f[i - 1][j - 1] - 2 * x[i] + b[i] + d[i]);
				if(!(j == 1 && i > s)) f[i][j] = std::min(f[i][j], f[i - 1][j] + b[i] + c[i]);
				if(!(j == 1 && i > e)) f[i][j] = std::min(f[i][j], f[i - 1][j] + a[i] + d[i]);
				f[i][j] = std::min(f[i][j], f[i - 1][j + 1] + 2 * x[i] + a[i] + c[i]);  
			}
		}
	}
	std::cout << f[n][1] << "\n";
}
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
	Solve();

	return 0;
}
posted @   Fire_Raku  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示