专栏文章

题解:P14242 [CCPC 2024 Shandong I] 分割序列

P14242题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minjf155
此快照首次捕获于
2025/12/02 03:23
3 个月前
此快照最后确认于
2025/12/02 03:23
3 个月前
查看原文

思路

这道题我们看上去很像是动态规划,于是我们设 dpi,jdp_{i,j} 表示 kkii 时,考虑了前 jj 个数字时的最大答案。
发现空间复杂度为 O(n2)O(n ^ 2),炸飞了。
于是我们分析一下题目。
不难发现:每个数字至少会被加进答案一次。而一个数字如果会被加进答案两次,那么一定会是第一次的答案再加上这个数的值。即 kk 等于 11 时,答案为全部数字相加,然后,kk 等于 22 时,答案一定为 kk 等于 11 时的答案加上某一个后缀和。
发现这个有什么用呢,我们可以退出来一个结论:每一次的结果一定是上一次的答案加上
于是,我们一开始求出后缀和,然后排序去求解即可。
代码不难。
CPP
for (int i = 1;i <= n;i++) read(a[i]);
		for (int i = n;i > 0;i--) f[i] = f[i + 1] + a[i];
		cnt = f[1],sort(f + 2,f + n + 1),write(cnt),putchar(' ');
		for (int i = n;i > 1;i--) cnt += f[i],write(cnt),putchar(' ');
		putchar('\n');

评论

0 条评论,欢迎与作者交流。

正在加载评论...