感觉很难的区间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. 过滤字符串中的html标签

    C#中,我们有时需要过滤掉字符串中的部分html标签,以下是一些简单的html标签过滤方法,使用的主要方式是正则表达式 public static string ClearHtml(string ht ...

  2. win10操作系统 64位 原版 百度网盘下载

    iso镜像文件4.57G,这里压缩成两个两个包便于上传网盘: 使用时候,直接下载两个压缩包解压成镜像文件便可安装: 链接:https://pan.baidu.com/s/1JNgxuBzdzFpp-p ...

  3. 探索Redis设计与实现8:连接底层与表面的数据结构robj

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  4. 【数据库】一篇文章搞掂:SQL Server数据库

    问题: 1.同一段代码,在存储过程中运行比普通SQL执行速度慢几十倍 原理: 在SQL Server中有一个叫做 “Parameter sniffing”参数嗅探的特性.SQL Server在存储过程 ...

  5. (转)Maven中的库(repository)详解 ---repository配置查找构件(如.jar)的远程库

    转:https://blog.csdn.net/taiyangdao/article/details/52287856 Maven中的库(repository)是构件(artifact)的集合.构件以 ...

  6. python locust_TaskSet声明任务的典型方法是使用task装饰器的两种方法

    为TaskSet声明任务的典型方法是使用task装饰器.该min_wait和MAX_WAIT属性也可以在使用taskset类中重写. from locust import Locust, TaskSe ...

  7. web开发小知识

    session共享机制:f5刷新是再次提交之前的数据请求 地址栏回车属于不同的请求 不同浏览器获取不到之前数据 同一浏览器可以获取同步数据 session注销:session.invalidate() ...

  8. memcached 安装与简单实用使用

    一.简介 1.memcache与memcached的区别与联系: memcache是php的拓展,memcached是客户端,复杂的说:Memcache模块提供了于memcached方便的面向过程及面 ...

  9. Python 文件及文件夹处理

    import os,shutil def getfilelist(filepath): filelist = os.listdir(filepath) # 获取filepath文件夹下的所有的文件 # ...

  10. Django框架(十四)—— Django分页组件

    目录 Django分页组件 一.分页器 二.分页器的使用 三.案例 1.模板层 2.视图层 Django分页组件 一.分页器 数据量大的话,可以分页获取,查看 例如:图书管理中,如果有成千上万本书,要 ...