CF 1579 G
题目描述
在一根数轴上,你将依次放入
每次,你可以将线段放置于数轴上并使得其中一段等于上一段的末尾。假设上一次的末尾为
求最终摆出的的·线段长度并最小值。
思路
令
很明显有转移:
但这里的
你可能会想到
但如果当前是右端点,接着依次出现一个
但实际上
时空复杂度均为
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 10001, MAXV = 2001;
int t, n, a[MAXN], dp[MAXN][MAXV], ans;
void Solve() {
cin >> n;
for(int i = 1; i <= n; ++i) {
cin >> a[i];
}
for(int i = 0; i <= n; ++i) {
for(int j = 0; j <= 2000; ++j) {
dp[i][j] = 114514;
}
}
dp[0][0] = 0;
ans = 114514;
for(int i = 0; i < n; ++i) {
for(int j = 0; j <= 2000; ++j) {
if(j + a[i + 1] <= 2000) {
dp[i + 1][j + a[i + 1]] = min(dp[i + 1][j + a[i + 1]], max(0, dp[i][j] - a[i + 1]));
}
dp[i + 1][max(0, j - a[i + 1])] = min(dp[i + 1][max(0, j - a[i + 1])], dp[i][j] + a[i + 1]);
}
}
for(int i = 0; i <= 2000; ++i) {
ans = min(ans, dp[n][i] + i);
}
cout << ans << "\n";
}
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
for(cin >> t; t--; Solve()) {
}
return 0;
}
本文作者:Yaosicheng124
本文链接:https://www.cnblogs.com/yaosicheng124/p/18405536
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步