区间dp+预处理——cf1278F(难题)
感觉很难的区间dp,主要是状态难想
/*
对于一个区间[i,j],设其最小的颜色编号是c=Min[i,j],那么该区间显然有一大段是以c为底的
设这个颜色在该区间出现位置的两端是L[c],R[c],那么我们枚举该区间以c为底的颜色段[l,r]
显然l<=L[c],r>=R[c],则该区间被分为了五段:[i,l-1],[l,L[c]-1],[L[c],R[c]],[R[c]+1,r],[r+1,j]
1,5 段是不以c为底色的段, 2,4 是以c为底,但被其他颜色覆盖的段, 3 是被c包围,中间还有其他颜色的段 需要预处理Min[i,j],nxt[i]
枚举区间[i,j],再枚举l:[i,L[c]-1],r:[R[c]+1,j],最后处理中间的[L[c],R[c]],即遍历所有被c隔开的段落
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 998244353
#define N 1007
#define M 2000005
inline ll fk(ll x){return x>=mod?x-mod:x;} ll n,m,a[M],b[M],tot;
ll L[N],R[N],Min[N][N],f[N][N];
int pos[N],nxt[N]; int main(){
cin>>n>>m;
for(int i=;i<=m;i++){
cin>>a[i];
}
for(int i=;i<=m;i++)
if(a[i]!=a[i-])b[++tot]=a[i];
if(tot>*n){cout<<''<<'\n';return ;} m=tot;for(int i=;i<=m;i++)a[i]=b[i]; //处理序列自动机
for(int i=;i<=m;i++)pos[i]=m+;
for(int i=m;i>=;i--){
nxt[i]=pos[a[i]];
pos[a[i]]=i;
} //处理L,R数组
memset(L,0x3f,sizeof L);
for(ll i=;i<=m;i++){
L[a[i]]=min(L[a[i]],i);
R[a[i]]=max(R[a[i]],i);
} //处理Min数组
memset(Min,0x3f,sizeof Min);
for(int i=;i<=m;i++)
for(int j=i;j<=m;j++)
for(int k=i;k<=j;k++)
Min[i][j]=min(Min[i][j],a[k]); //初始化
for(int i=;i<=m+;i++){
if(i && i<=m && L[a[i]]==i && R[a[i]]==i)f[i][i]=;//没被隔断的区间
for(int j=;j<=m+;j++)
if(i>j)f[i][j]=;
} for(int k=;k<m;k++)
for(int i=;i+k<=m;i++){
int p=Min[i][i+k];if(p>N)continue;
if(L[p]<i || R[p]>i+k)continue;//p的范围超过了[i,i+k],说明这个区间不用计算 ll cntl=,cntr=,sum=;
for(int j=i;j<=L[p];j++)//枚举[i,L[p]]
cntl=fk(cntl+f[i][j-]*f[j][L[p]-]%mod); for(int j=R[p];j<=i+k;j++)//枚举[R[p],j]
cntr=fk(cntr+f[R[p]+][j]*f[j+][i+k]%mod); for(int j=L[p];j<R[p];j=nxt[j])//枚举[L[p],R[p]]中被p隔开的所有段
sum=sum*f[j+][nxt[j]-]%mod;
f[i][i+k]=cntl*cntr%mod*sum%mod;
} cout<<f[][m]<<'\n';
}
区间dp+预处理——cf1278F(难题)的更多相关文章
- Codeforces Gym 101194C Mr. Panda and Strips(2016 EC-Final,区间DP预处理 + 枚举剪枝)
题目链接 2016 EC-Final 题意 现在要找到数列中连续两个子序列(没有公共部分).要求这两个子序列本身内部没有重复出现的数. 求这两个子序列的长度的和的最大值. 首先预处理一下.令$ ...
- Palindrome Bo (预处理 + 区间DP)
先进行离散化,然后再预处理出所有位置的下一个元素,做好这一步对时间的优化非常重要. 剩下的就是一般的DP了.区间DP #include<bits/stdc++.h> using names ...
- Palindromic characteristics CodeForces - 835D (区间DP,预处理回文串问题)
Palindromic characteristics of string s with length |s| is a sequence of |s|integers, where k-th num ...
- LightOJ1044 Palindrome Partitioning(区间DP+线性DP)
问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...
- LightOJ1033 Generating Palindromes(区间DP/LCS)
题目要计算一个字符串最少添加几个字符使其成为回文串. 一年多前,我LCS这道经典DP例题看得还一知半解时遇到一样的问题,http://acm.fafu.edu.cn/problem.php?id=10 ...
- Vijos 1100 (区间DP)
题目链接: https://vijos.org/p/1100 题目大意:NOIP著名的加分二叉树.给出一棵树的中序遍历,加分规则左子树*右子树+根.空子树分数为1.问最大加分的树结构,输出树结构的先序 ...
- 2016 ACM/ICPC Asia Regional Shenyang Online 1009/HDU 5900 区间dp
QSC and Master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- Light OJ 1031 - Easy Game(区间DP)
题目大意: 给你一个n,代表n个数字,现在有两个选手,选手A,B轮流有有一次机会,每个选手一次可以得到一个或者多个数字,从左侧或者右侧,但是不能同时从两边取数字,当所有的数字被取完,那么游戏结束.然后 ...
- CSU 1616: Heaps(区间DP)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1616 1616: Heaps Time Limit: 2 Sec Memory Lim ...
随机推荐
- python字符串的截取,查找
1.字符串的截取 str = "123456" str[:3] = 123 str[1:3] = 23 str[0:-1] = 12345 里面的数字都是index索引,从第一个索 ...
- JRE和JVM的区别
JRE和JVM的区别 JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台.所有的Java程序都要在JRE下才能运行.JDK的工具也是Java程序, ...
- 【Flutter学习】之动画实现原理浅析(一)
一,动画介绍 动画对于App来说,非常的重要.很多App,正是因为有了动画,所以才会觉得炫酷.移动端的动画库有非常的多,例如iOS上的Pop.web端的animate.css.Android端的And ...
- 查看电脑是否安装jdk以及安装了的路径
1.输入cmd进入dos界面2.输入java -version,回车 C:\Users\Lenovo>java -versionjava version "1.7.0_71" ...
- AcWing 215. 破译密码 (莫比乌斯反演)打卡
达达正在破解一段密码,他需要回答很多类似的问题: 对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. 作为达达的同学,达达希望得到你的帮助. ...
- docker常见启动参数
dockerd启动参数详解: dockerd \ --bip \ #设置docker0网段 --selinux-enabled=false \ #关闭selinux --insecure-regist ...
- 爬虫 fake_useragent
import requests from fake_useragent import UserAgent ua = UserAgent() headers = { "UserAgent&qu ...
- 使用python实现希尔、计数、基数排序
希尔排序 希尔排序是一个叫希尔的数学家提出的一种优化版本的插入排序. 首先取一个整数d1=n//2,将元素分为d1个组,每组相邻元素之间的距离为d1,在各组内进行直接插入排序. 取第二个整数d2=d1 ...
- Win10+CentOS7双系统引导修复
在有Win10的系统下安装了CentOS7后,CentOS7的引导并不会像CentOS6一样自动加载入Win10驱动.难道是grub2不能引导Win驱动?查了一下资料原来是CentOS不能识别Win1 ...
- Jmeter beanshell断言 org.json.jar包下载
链接:https://pan.baidu.com/s/1O01ODjlKyqmz2NyDT0MCww 提取码:a5va 欢迎关注微信公众号:软件测试汪,qq技术交流群:809111560