P11233 CSP-S 2024 染色
P11233 CSP-S 2024 染色
考试最后码方程忘记
思路
从这里入手,设
设
其中
接下来考虑转移。
类似的,有:
那么有
类似的
观察
重新设
方程变为:
剩下两条与上面方程类似,就不写了。
对于方程
那么先对于所有的
最后答案时
Ps:其实你发现第 3 维的作用仅限于统计答案,所以其实可以去掉。
具体操作看实现,时间复杂度
CODE
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxL=1e6+5,maxn=2e5+5;
int n;
int a[maxn];
ll cho[maxL][2],acl[2],sum[maxn],dp[maxn][2][2];
int main()
{
// freopen("color2.in","r",stdin);
// freopen("color.out","w",stdout);
int _;
scanf("%d",&_);
while(_--)
{
memset(cho,-0x3f,sizeof(cho));
memset(acl,0,sizeof(acl));
memset(sum,0,sizeof(sum));
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+(a[i-1]==a[i])*a[i];
for(int i=1;i<=n;i++)
{
dp[i][0][0]=max(acl[1]+sum[i-1],cho[a[i]][1]+sum[i-1]+a[i]);
dp[i][1][0]=max(acl[0]+sum[i-1],cho[a[i]][0]+sum[i-1]+a[i]);
acl[0]=max(acl[0],dp[i][0][0]-sum[i]);
acl[1]=max(acl[1],dp[i][1][0]-sum[i]);
cho[a[i-1]][1]=max(cho[a[i-1]][1],dp[i][1][0]-sum[i]);
cho[a[i-1]][0]=max(cho[a[i-1]][0],dp[i][0][0]-sum[i]);
dp[i][0][1]=acl[0]+sum[i];
dp[i][1][1]=acl[1]+sum[i];
}
printf("%lld\n",max(dp[n][0][1],dp[n][1][1]));
}
}
后记
去年忘记加 1 少
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!