[CSP-S 2024] 染色 题解

news/2024/11/29 11:39:17/文章来源:https://www.cnblogs.com/ZYStream/p/18576101

题目链接

[CSP-S 2024] 染色

题解

这是一道线性 \(dp\) 问题,难点在于在具体的题目背景中抽象出实际问题,最难的地方是分类讨论。
根据题目的意思,如果第 \(i\) 位数字(\(a_{i}\))的颜色和第 \(i\) 位之前的数字(\(a_{[1,i]}\))的颜色都不同,则这个数字贡献为 \(0\),接着,如果前面有相同的颜色,再如果离第 \(i\) 位最近的相同颜色的数字和第 \(i\) 数字相同,则第 \(i\) 位数字贡献为 \(a_{i}\)。我们只讨论这个数可以有贡献时的情况,但这个数无论如何也无法贡献时不进行讨论,我们用结构体存 \(a_{i}\) 这个数字在之前出现过的位置的下标以及这个数字本身:

struct num{ll n,last;
}a[2000005];

\(a_{i}\) 在之前没有出现过时,\(a_{i}(last)=0\) ,接下来讨论以下情况

  • 两个相同的数相邻(\(a_{i}=a_{i-1}\)),这样的两个数,只要颜色相同,无论如何都会产生贡献,但是对后续有影响(请先看下文)
  • 两个相同数不相邻,存在 \(i>j\)\(a_{i}=a_{j}\) ,那么要想让 \(a_{i}\) 产生贡献,\(a_{[i+1,j-1]}\) 区间内的数字必须是同一颜色且和 \(a_{i},_a{j}\) 的颜色不同,那么对于 \(a_{[i+1,j-1]}\) 内的数字,如果存在两个相同的数,但这两个数又不相邻,它们的贡献就没有了。
  • 两组相同的数交叉,如果想让两组数都产生贡献,必须满足下列状态:
x,...,y,x,...,y

如果是下面这种状态,只能使其中一组产生贡献:

x,...,y,...,x,...,y

经过上面的分类讨论后,我们设 \(f_{i,j=0/1}\) 表示对于前 \(i\) 个数字,当 \(j=0\),表示第 \(i\) 个数字与第 \(a_{i}(last)\) 不产生贡献时的最优解,当 \(j=1\) 时,表示第 \(i\) 个数字与第 \(a_{i}(last)\) 产生贡献时的最优解。如果两个数字既相邻又相同,要把他们的贡献算进最后的答案里,但是在表示状态时,必须表示成没有产生贡献的状态。如果出现交叉情况,直接访问 \(a_{i}(last)\)\(a_{i}(last)+1\) 两个位置上的数值即可。易得到状态转移方程式:

  • 普遍情况:
    \( f_{i,0}=\max (f_{i-1,1}\ ,\ f_{i-1,0}) \)
    \( f_{i,1}=\max (f_{a_{i}(last),1}\ ,\ f_{{a_{i}(last)},0} \ ,\ f_{a_{i}(last)+1,1}\ ,\ f_{{a_{i}(last)+1},0}) \)
  • 出现相邻两数的情况时:
    \( f_{i,0}=\max (f_{i-1,1}\ ,\ f_{i-1,0}) \)
    \( f_{i,1}=f_{i,0} \)
    将所有出现过的相邻相同两数加在一起,记为 \(anstmp\) ,最终答案就是 \(\max(f_{n,0} \ ,\ f_{n,1}) \ + \ anstmp\)

CODE

#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;ll t,anstmp;
ll dp[2000005][2];
ll lst[2000005];struct num{ll n,last;
}a[2000005];int main(){ll t;scanf("%lld",&t);while (t--){ll n;scanf("%lld",&n);memset(dp,0,sizeof(dp));memset(lst,0,sizeof(lst));anstmp=0;for (ll i=1;i<=n;i++){scanf("%lld",&a[i].n);if (lst[a[i].n]) a[i].last=lst[a[i].n];else a[i].last=0;lst[a[i].n]=i;if (a[i-1].n==a[i].n) anstmp=anstmp+a[i].n;}for (ll i=1;i<=n;i++){if (a[i].n==a[i-1].n){dp[i][0]=max(dp[i-1][0],dp[i-1][1]);dp[i][1]=dp[i-1][1];continue;}else dp[i][0]=max(dp[i-1][0],dp[i-1][1]);if (a[i].last) dp[i][1]=max(max(dp[a[i].last][0],dp[a[i].last][1]),max(dp[a[i].last+1][0],dp[a[i].last+1][1]))+a[i].n;}printf("%lld\n",max(dp[n][0],dp[n][1])+anstmp);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843355.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode39 组合总和

leetcode39 组合总和思路: 这题也是用回溯,但是考虑到不能重复,所以用一个currentNum记录当前遍历到哪了,按照大小顺序遍历防止重复就行。 class Solution {//11:10-11:18public void dfs(int[] candidates,List<List<Integer>> ans,int currentNum,List<…

hhdb数据库介绍(9-27)

计算节点参数说明 ndbSqlAddr & ndbSqlUser & ndbSqlPass 参数说明:Property Value参数值 ndbSqlAddr是否可见 是参数说明 NDB SQL端IP地址默认值 localhost:3329Reload是否生效 否Property Value参数值 ndbSqlUser是否可见 是参数说明 NDB SQL前端用户名默认值 rootR…

09C++选择结构(3)

1、求3个整数中最小值; 2、3个数排序; 3、随机函数rand(); 4、if语句的应用; 5、bug与debug一、求3个整数中最小值 题目:输入三个整数,表示梨的重量,输出最小的数。 方法1:经过三次两两比较,得出最小值。 a<=b && a<=c min=ab<=c && b<=a…

hhdb数据库介绍(9-26)

计算节点参数说明 masterSourceInitWaitTimeout 参数说明:Property Value参数值 masterSourceInitWaitTimeout是否可见 否参数说明 启动时数据节点中主存储节点初始化超时时间默认值 300最小值 0最大值 600Reload是否生效 是参数作用: 启动时,主存储节点在首次初始化失败后,…

[TSDB] OpenGemini wal文件与tssp文件的用途与关系

前言 openGemini是一款面向物联网、车联网、工业互联网、运维监控等领域的开源分布式时序数据库。 在openGemini中,WAL(Write-Ahead Logging)文件和TSSP(Time Series Storage Protocol)文件扮演着重要的角色,以下是关于它们的用途及关系的详细解释: WAL文件 用途WAL文件…

hhdb数据库介绍(9-24)

计算节点参数说明 failoverAutoresetslave 参数说明:Property Value参数值 failoverAutoresetslave是否可见 是参数说明 故障切换时,是否自动重置主从复制关系默认值 falseReload是否生效 否参数设置: <property name="failoverAutoresetslave">false</p…

“4个应用场景”以图搜图与实物比对,赋能机械制造智能化升级

背景 随着制造业和工业生产的不断发展,机械设计和加工过程中的图纸与实物比对成为生产质量管控的重要环节。然而,传统手动比对方式耗时费力,且易出现误差。思通数科凭借自主研发的大模型技术,为用户提供了一套高效、智能的以图搜图与实物比对解决方案,大幅提升了机械设计和…

校园防欺凌ai语音监控系统

校园防欺凌ai语音监控系统核心优势在于其先进的音频识别算法,校园防欺凌ai语音监控系统能够识别出关键词如侮辱、恐吓、求救等敏感语言,并能够区分正常的交流和潜在的欺凌行为。系统通过安装在校园各关键区域的麦克风捕捉声音信号,这些信号会被实时传输到中央处理单元。在这…

hhdb数据库介绍(9-18)

SQL语法支持 计算节点语法特殊功能 默认分片规则建表 在使用关系集群数据库时,需要先将表的分片规则信息配置好之后才能创建表。实际使用过程中,用户可能对关系集群数据库及分片规则不了解,这就需要一种能直接过渡到HHDB Server的方案,该方案能根据逻辑库关联的分片节点数量…

Windows Cmd查询端口号对应的进程及关闭进程

Windows Cmd查询端口号对应的进程及关闭进程 1. 使用 netstat 查询端口和进程信息 运行以下命令: netstat -ano | findstr :端口号示例: 如果要查询端口 80812. 查找进程 ID 所属的程序 通过上面命令的输出获取到 PID(进程 ID)后,可以使用以下命令查看对应的程序名称: ta…

hhdb数据库介绍(9-16)

SQL语法支持 事务管理与锁语句语句类型 事务语句 语句参数 状态 说明事务管理 START TRANSACTION 无参数 支持WITH CONSISTENT SNAPSHOT 支持READ WRITE 支持READ ONLY 支持BEGIN支持COMMIT支持COMMIT [AND [NO] CHAIN] [[NO] RELEASE] 支持ROLLBACK支持ROLLBACK [AND [NO] CHA…

MySQL_索引失效_类型转换

1.类型转换索引失效场景SELECT * FROM tbl_name WHERE str_col=1; 列str_col上有建立索引,一个字符串类型的列给一个整数类型的值。 问题:为什么会导致索引失效? 原因:MySQL官方文档解释:The reason for this is that there are many different strings that may convert …