感觉很难的区间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(难题)的更多相关文章

  1. Codeforces Gym 101194C Mr. Panda and Strips(2016 EC-Final,区间DP预处理 + 枚举剪枝)

    题目链接  2016 EC-Final 题意  现在要找到数列中连续两个子序列(没有公共部分).要求这两个子序列本身内部没有重复出现的数.   求这两个子序列的长度的和的最大值. 首先预处理一下.令$ ...

  2. Palindrome Bo (预处理 + 区间DP)

    先进行离散化,然后再预处理出所有位置的下一个元素,做好这一步对时间的优化非常重要. 剩下的就是一般的DP了.区间DP #include<bits/stdc++.h> using names ...

  3. Palindromic characteristics CodeForces - 835D (区间DP,预处理回文串问题)

    Palindromic characteristics of string s with length |s| is a sequence of |s|integers, where k-th num ...

  4. LightOJ1044 Palindrome Partitioning(区间DP+线性DP)

    问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...

  5. LightOJ1033 Generating Palindromes(区间DP/LCS)

    题目要计算一个字符串最少添加几个字符使其成为回文串. 一年多前,我LCS这道经典DP例题看得还一知半解时遇到一样的问题,http://acm.fafu.edu.cn/problem.php?id=10 ...

  6. Vijos 1100 (区间DP)

    题目链接: https://vijos.org/p/1100 题目大意:NOIP著名的加分二叉树.给出一棵树的中序遍历,加分规则左子树*右子树+根.空子树分数为1.问最大加分的树结构,输出树结构的先序 ...

  7. 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) ...

  8. Light OJ 1031 - Easy Game(区间DP)

    题目大意: 给你一个n,代表n个数字,现在有两个选手,选手A,B轮流有有一次机会,每个选手一次可以得到一个或者多个数字,从左侧或者右侧,但是不能同时从两边取数字,当所有的数字被取完,那么游戏结束.然后 ...

  9. CSU 1616: Heaps(区间DP)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1616 1616: Heaps Time Limit: 2 Sec  Memory Lim ...

随机推荐

  1. springColud父工程依赖配置

    <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...

  2. Freemarker模板和依赖

    <html> <head> <meta charset="utf-8"> <title>Freemarker入门小DEMO < ...

  3. Java8 使用stream 实现wordcount

    案例: public static void main(String[] args) { List<String> items = Arrays.asList("apple&qu ...

  4. 【Flutter学习】之动画实现原理浅析(二)

    1. 介绍 本文会从代码层面去介绍Flutter动画,因此不会涉及到Flutter动画的具体使用. 1.1 Animation库 Flutter的animation库只依赖两个库,Dart库以及phy ...

  5. .net文件下载的四种方法

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  6. SQL注入系列:SQLi Labs

    前言 关于注释 说明:在SQL中--[空格]表示注释,但是在URL中--空格在发送请求的时候会把最后的空格去掉,所以用--+代替,因为+在被URL编码后会变成空格 MYSQL有三种常用注释: --[空 ...

  7. 2019 牛客暑期多校 B generator 1 (矩阵快速幂+倍增)

    题目:https://ac.nowcoder.com/acm/contest/885/B 题意:给你x0,x1,让你求出xn,递推式时xn=a*xn-1+b*xn-2 思路:这个n特别大,我自己没有摸 ...

  8. CF446D DZY Loves Games

    CF446D DZY Loves Games 高斯消元好题 如果暴力地,令f[i][k]表示到i,有k条命的概率,就没法做了. 转化题意 生命取决于经过陷阱的个数 把这个看成一步 所以考虑从一个陷阱到 ...

  9. windows7+tomcat7+nginx1.11.3 +memcached

    测试的环境是windows7+tomcat7+nginx1.11.3 +memcached 安装方法网上很多就不多说了. 1.session共享需要这几个jar 包  下载地址 http://down ...

  10. 什么是AngularJs?特点是什么?和JQuery什么区别和联系

    什么是AngularJs? AngularJs是js框架,集中操作数据,不关注Dom操作,适用于以数据操作为主的的SPA(单页应用). 它的特点 采用MVC模型 双向数据绑定 依赖注入 模块化 与jQ ...