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

[CSP-S 2024] 染色

还记得当时在考场上看到这个题内心是痛苦的,想着骗一骗分,但是我当时根本不知道动态规划是什么,所以没能做出来。

今天重看,发现一个很强的解法,甚至是来自 JY 中学的,这不得不整理一下了。

做法。

采取最简单的状态设计,设 \(dp[i]\) 为考虑到第 \(i\) 位的答案。

我们每一次固然是从上一次当前值出现的地方进行转移。

我们用 \(last[a[i]]\) 表示 \(i\) 的上一个位置。

我们需要让这个位置和当前位置颜色一样,中间的地方都是另外一个颜色的。

中间这一部分只有相邻相等的才能贡献。

所以不难列出来式子。

\(f_i=max_{i=1}^{n}(f_{last[a_i]+1}+a_i+sum[i]-sum[last[a_i]])\)

sum 就是相邻相等的前缀和

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MN=1e6+116;
int dp[MN], last[MN], sum[MN];
int n, a[MN], T;
signed main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin>>T; while(T--){memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp));memset(last,0,sizeof(last)); memset(sum,0,sizeof(sum));cin>>n; for(int i=1; i<=n; ++i) cin>>a[i];for(int i=2; i<=n; ++i) sum[i]=(a[i]==a[i-1]?sum[i-1]+a[i]:sum[i-1]);for(int i=1; i<=n; ++i){dp[i]=dp[i-1];if(last[a[i]]) dp[i]=max(dp[last[a[i]]+1]+a[i]+sum[i]-sum[last[a[i]]+1],dp[i]);last[a[i]]=i;}cout<<dp[n]<<'\n';		}return 0;
}
http://www.hskmm.com/?act=detail&tid=15033

相关文章:

  • Kerberos 安装和使用
  • 第一次个人编程任务
  • 概率期望总结
  • redis实现秒杀下单的业务逻辑
  • 关于边缘网络+数据库(1)边缘网络数据库模式及选型
  • 题解:B4357 [GESP202506 二级] 幂和数
  • 2025年9月23日 - 20243867孙堃2405
  • 2025.9.23
  • 软件工程学习日志2025.9.23
  • markdown 使用指南
  • 第6.2节 Android Agent制作<三>
  • LVS 服务器 知识
  • 07-django+DRF项目中统一json返回格式 - 详解
  • 软工第二次作业——个人项目
  • 近十年 CSP-J 复赛知识点分布表
  • AT_arc181_d [ARC181D] Prefix Bubble Sort
  • 【MySQL】使用C/C++链接mysql数据库 - 指南
  • 枚举子集
  • cv-css 快捷方式,将指定节点的计算样式获取下拉 获取tailwind网页样式成原生样式
  • day002
  • PyTorch图神经网络(四)
  • 软件工程:构建数字世界的基石
  • Avalonia 学习笔记07. Control Themes(控件主题)
  • matter 协议的架构;
  • matter 协议解析;
  • 9月23日
  • Nordic 的支持对Matter 协议的支持;
  • nRF54LM20A USB
  • nRF54LM20A GRTC
  • 2025年10款最佳生产力提效chrome插件推荐,亲测有用