[AGC031B] Reversi
1.[ABC134F] Permutation Oddness2.[ABC215D] Coprime 23.[ARC126C] Maximize GCD4.[ARC125C] LIS to Original Sequence5.[ARC125D] Unique Subsequence6.[ABC215F] Dist Max 27.[ARC117D] Miracle Tree
8.[AGC031B] Reversi
9.[AGC030D] Inversion Sum10.[ARC139B] Make N11. [ARC052D] 9 12.[ARC136C] Circular Addition13.高橋君[AGC031B] Reversi
题面翻译#
有 块石头摆成一行,从左数第 块石头的颜色是 。
现在すぬけ会进行 次或若干次如下操作:选取两块颜色相同的石头并将两块石头之间的所有石头都染成与这两块石头相同的颜色。
求最终所有可能的石头排列方案数,答案对 取模。
思路#
考虑 DP。
考虑第 个石头,如果第 个石头不修改,方案数仍为 ;如果第 个石头修改,那么贡献就是第 个石头与前面所有颜色相同石头进行操作的可能操作数。
记 为上一个与 颜色相同石头的位置。
所以转移方程为
Code#
#include <bits/stdc++.h>
using namespace std;
const int N = 5005000;
const int Mod = 1e9 + 7;
int n;
int a[N];
int cnt,col[N];
int dp[N],last[N];
int main() {
ios::sync_with_stdio(false);
cin >> n;
for(int i = 1;i <= n; i++) {
cin >> a[i];
}
for(int i = 1;i <= n; i++) {
if(a[i] != a[i - 1]) {
cnt ++;
col[cnt] = a[i];
}
}
dp[0] = 1;
for(int i = 1;i <= cnt; i++) {
dp[i] = dp[i - 1];
if(last[col[i]]) {
int j = last[col[i]];
dp[i] = (dp[i] + dp[j]) % Mod;
}
last[col[i]] = i;
}
cout << (dp[cnt] + Mod) % Mod << "\n";
return 0;
}
作者:白简
出处:https://www.cnblogs.com/baijian0212/p/AGC031B.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」