当前位置: 首页 > news >正文

[动态规划 + 前缀和]P11233 [CSP-S 2024] 染色 题解

这个题目如果动态规划数组是针对单点,最后会很难统计。因此设 \(dp_i\)\(A\) 中前 \(i\) 个元素所能产生最大贡献。

有一个动态规划的思想就是,对于数列 \(A\) 中的每一个元素,我们可以选择要不要让他产生贡献。方便起见叫这个元素 \(x\),他左边第一个和他值相等的元素叫 \(lst\)

  • 如果让他产生贡献,那么显然 \(x\)\(lst\) 之间的所有格子都要涂成别的颜色。此时 $$dp_i = dp_{lst} + V(lst + 1, i - 1) + a_i$$其中 \(V(lst + 1, i - 1)\) 指把这一段全涂成一个颜色所能产生的贡献。

  • 如果不产生贡献,那么 $$dp_i = dp_{i - 1}$$

考虑 \(V(lst + 1, i - 1)\) 如何计算。

我们发现,对于 \([lst + 2, i - 1]\) 的区间,可以确定在全涂一个颜色后它们会不会产生贡献。因为产不产生贡献只与左侧第一个与其同颜色的元素的数值有关。那么这些元素对 \(V\) 的贡献只需要判断一下左边第一个值是否一样就行。这个是可以预处理的。

 rep(i, 1, n) {sum[i] = sum[i - 1];if(a[i] == a[i - 1]) {sum[i] += a[i]; //这样就可以后面O(1)计算}}

这样的话 \(V(a, b) = sum_b - sum_{a - 1}\)

而对于位置 \(lst + 1\) 则不能确定,因为在之前的最佳决策中,位置 \(lst + 1\) 左侧的第一个和他颜色一样的元素我们不知道值是多少。

因此咱们直接把 \(lst + 1\) 这个位置也扔到方程转移里,就像这样。

\[dp_i = dp_{lst + 1} + V(lst + 2, i - 1) + a_i \]

\[= dp_{lst + 1} + sum_{i - 1} - sum_{lst + 1} + a_i \]

在实现的时候有个问题。 \(lst\) 可以等于 \(i - 1\), 这样 \(sum_{i - 1} - sum_{lst + 1}\) 就是负数了。

那么我们可以把式子写做 $$dp_{lst + 1} + sum_{i} - sum_{lst + 1} + a_i$$

为什么合法呢?这样不会多算 \(i\) 位置的贡献吗?

答案是不会。分类讨论一下,如果 \(lst = i - 1\),那么减出来值为 0。如果小于,那么 \(sum_{i - 1} = sum_i\), 没任何问题。

完整的代码!

#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = a; i <= b; ++i)
using namespace std;
const int N = 1000005;
long long v, t, n, a[N], lst[N], sum[N], dp[N];
inline void solve() {cin >> n;rep(i, 1, n) dp[i] = sum[i] = 0;	rep(i, 1, n) {cin >> a[i];lst[a[i]] = 0;}rep(i, 1, n) {sum[i] = sum[i - 1];if(a[i] == a[i - 1]) {sum[i] += a[i];}}rep(i, 1, n) {dp[i] = dp[i - 1];if(lst[a[i]]) dp[i] = max(dp[lst[a[i]] + 1] + sum[i] - sum[lst[a[i]] + 1] + a[i], dp[i - 1]);lst[a[i]] = i;}cout << dp[n] << '\n';
}
int main() {ios :: sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> t;while(t--) {solve();}return 0;
}
http://www.sczhlp.com/news/78394/

相关文章:

  • 淘宝联盟自建网站教程手机网站建设资讯
  • 广州住房与城乡建设部网站机关网站建设总结
  • 网站上的图片一般多大我有小创意设计校服图片
  • 用python做的大型网站做网站的软件 简单易学
  • 网站选择理由描述微信小程序在哪里找出来
  • 序列dp
  • shell - 参数变量拼接字符串时,错位解决
  • 25秋周总结1
  • 怎样建立和设计公司网站企业策划案
  • 网站alexa流量查询怎么在百度做网站
  • 网站点击量设计.win域名做网站怎么样
  • 简述网站开发的过程杭州网站推广营销
  • 做网站用哪个ecalipse百度开户推广
  • 江西移动网站网站制造
  • 搜索网站关键词石家庄新钥匙做网站
  • 免费网站模板源码下载网站建设费需要列入无形资产吗
  • 网站制作泉州公司wordpress如何建立网站
  • CSP概述
  • 简单aspx网站开发网络推广对企业有什么好处
  • 北京网站维护女生做网站编辑
  • 佛山论坛建站模板北京社交网站建设
  • 手机p2p网站解释seo网站推广
  • 陕西宁德建设工程有限公司网站柳州免费做网站的公司
  • 杭州企业seo网站优化可以做微信游戏的网站
  • 卡盟网站制作网站常用代码
  • 昆山外贸型网站制作天津做胎儿鉴定网站
  • 电子商务网站建设与管理期末考试网推赚钱项目
  • 电子ic网站建设泉州手机网站建设价格
  • 新开传奇网站发布网怎么创建网站
  • 潍坊兆通网站建设wordpress备份数库