P9505 0分求助
查看原帖
P9505 0分求助
520777
LaoXu666楼主2023/8/6 22:05
#include <algorithm>
#include <cstring>
#include <iostream>

typedef long long LL;
LL N, K, DP[3005][3005], Input[3005], Arr[3005];

LL Val(LL L, LL R) {
	return (R - L - 1) * (R - L) / 2 * std::max(Arr[L], Arr[R]) + Arr[R] * Arr[R];
}

LL Pos = 0;

int main() {
	std::cin >> N >> K;
	for (int i = 0; i < N; i++) {
		std::cin >> Input[i];
		if (Input[i] == 0) Pos = i;
	}
	for (int i = 0; i < N; i++) {
		Arr[i + 1] = Input[(i + Pos) % N];
	}
	std::memset(DP, 0x3F, sizeof DP);
	DP[1][1] = 0;
	for (LL R = 1; R <= N; R++) {
		for (LL Num = 2; Num <= std::min(R, K); Num++) {
			for (LL L = 1; L <= R; L++) {
				DP[R][Num] = std::min(DP[R][Num], DP[L][Num - 1] + Val(L, R));
				if (Num == K) {
					DP[R][Num] = std::min(DP[R][Num], DP[L][Num] + Val(L, R));
				}
			}
		}
	}
	LL Ans = 0x3F3F3F3F3F3F3F3F;
	for (int Id = 1; Id <= N; Id++) {
		Ans = std::min(Ans, DP[Id][K] + Val(Id, N + 1));
	}
	std::cout << Ans << '\n';
	return 0;
}

2023/8/6 22:05
加载中...