AtCoder Grand Contest 062 B Split and Insert

洛谷传送门

AtCoder 传送门

妙妙题。

像这种最优化问题,数据范围又比较小,大概率不是贪心,想 dp。

正着做不好做,因为你无法知道序列变成了什么样子,没有任何信息能记录到状态里面。

考虑逆序操作。每次相当于取出一个子序列,放到后面。最终目标是将数组排成升序。

考虑区间 dp,设 \(f_{k,i,j}\) 为进行完第 \(k \sim K\) 次操作,已经把数组中值为 \(i \sim j\) 的数排好序。有转移:

  • \(f_{k,i,j} \gets f_{k+1,i,j}\),表示这次操作可以不动;
  • \(f_{k,i,j} \gets f_{k+1,i,x} + f_{k+1,x+1,j} + c_k \times (j - x), x \in [i,j)\),表示选权值在 \([x + 1, j]\) 之中的数,拎到最后面,花费是 \(c_k \times (j - x)\)

初值是 \(f_{m+1,i,j} = 0\),其中权值在 \([i,j]\) 之中的数已经在原排列中排好序。

答案就是 \(f_{1,1,n}\)

时间复杂度 \(O(n^3k)\)

code
// Problem: B - Split and Insert
// Contest: AtCoder - AtCoder Grand Contest 062
// URL: https://atcoder.jp/contests/agc062/tasks/agc062_b
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 110;

ll n, m, a[maxn], b[maxn], c[maxn], f[maxn][maxn][maxn];

void solve() {
	scanf("%lld%lld", &n, &m);
	for (int i = 1; i <= m; ++i) {
		scanf("%lld", &b[i]);
	}
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
		c[a[i]] = i;
	}
	mems(f, 0x3f);
	for (int i = 1; i <= n; ++i) {
		for (int j = i; j <= n; ++j) {
			bool flag = 1;
			for (int k = i; k < j; ++k) {
				if (c[k] > c[k + 1]) {
					flag = 0;
					break;
				}
			}
			if (flag) {
				f[m + 1][i][j] = 0;
			}
		}
	}
	for (int k = m; k; --k) {
		for (int p = 1; p <= n; ++p) {
			for (int i = 1, j = p; j <= n; ++i, ++j) {
				f[k][i][j] = f[k + 1][i][j];
				for (int x = i; x < j; ++x) {
					f[k][i][j] = min(f[k][i][j], f[k + 1][i][x] + f[k + 1][x + 1][j] + b[k] * (j - x));
				}
			}
		}
	}
	printf("%lld\n", f[1][1][n] > 1e18 ? -1LL : f[1][1][n]);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

posted @ 2023-05-22 10:50  zltzlt  阅读(26)  评论(0编辑  收藏  举报