有点硬核的dp。。要用到一个结论。。

/*
把原串拆成奇偶串,再拆成极大连续的-1串:该串两端都是非-1数,中间都是-1,并且下标要么都是偶数,要么都是技术
然后对所有这些串进行dp,dp[i][0]表示到第i个-1的方案数,0表示第i个-1填的数和该串最右端的数不同,1表示相同 为什么这样是可行的?
一个重要结论:拆分成奇偶串就可以使不出现回文串的条件转化为相邻两个字符不相等
而相邻两个字符不相等的填数方案可以用dp来做,并且每一段不连续的-1段都是满足乘法原理的,段内就是递推
有个经典套路: dp[i][0]表示到第i个-1的方案数,0表示第i个-1填的数和该串最右端的数不同,1表示相同
一些细节:-1段可能在段首出现,也可能在段尾出现,有可能出现a[-1]的情况,所以额外开个空数组
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 200005
#define mod 998244353
int n,k,use1[maxn],a[maxn];
ll use2[maxn],f[maxn][],ans; ll calc(int a,int b,int len){//段左端元素,右端元素,-1段的长度
if(len==){//如果-1段长为0,特判一下
if(a==b && a!= && b!=)return ;
return ;
}
if(b==){
ll tmp=;
if(a==)tmp=k;
else tmp=k-;
for(int i=;i<=len-;i++)tmp=tmp*(k-)%mod;
return tmp;
}
for(int i=;i<=len;i++)f[i][]=f[i][]=;
if(a==){//-1在段首出现的情况
f[][]=k-,f[][]=;
len--;
}
else if(a==b)f[][]=;//处理一下初始状态
else f[][]=;
for(int i=;i<=len;i++){
f[i][]=(f[i][]+f[i-][]*(k-)+f[i-][]*(k-))%mod;
f[i][]=f[i-][];
} return f[len][];
}
int main(){
cin>>n>>k;ans=;
for(int i=;i<=n;i++)cin>>a[i]; int last=-;
for(int i=;i<=n+;i+=)
if(a[i]!=-)
ans=ans*calc(a[last],a[i],(i-last)/-)%mod,last=i;
last=;
for(int i=;i<=n+;i+=)
if(a[i]!=-)
ans=ans*calc(a[last],a[i],(i-last)/-)%mod,last=i;
cout<<ans;
}

cf1140E 回文串+染色方案dp的更多相关文章

  1. UVA - 11584 Partitioning by Palindromes(划分成回文串)(dp)

    题意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000. 分析: 1.dp[i]为字符0~i划分成的最小回文串的个数. 2.dp[j] = Min(dp[j ...

  2. 便宜的回文串(区间DP)

    题目链接:便宜的回文串 这道题刚开始其实还是没有思路的.没办法,只能看题解了... 其实我们在思考问题时,考虑到一段串增或减时会改变它的长度,所以转移时会麻烦... 但其实不用考虑那么多的问题,我们只 ...

  3. 随手练——Uva-11584 划分成回文串(区间DP)

    思路:dp[i]代表到第i位的最小值,枚举它的前几位,求出最小值. 转移方程:dp[ i ] = min(dp[ i ], dp[ j - 1 ] + 1 ) ; 本来觉得,代码加深部分可以提前bre ...

  4. 最长双回文串(模板+dp)

    题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline ll read(){ , f ...

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

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

  6. UVA - 11584 划分字符串的回文串子串; 简单dp

    /** 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34398 UVA - 11584 划分字符串的回文串子串: 简单 ...

  7. 回文串+回溯法 URAL 1635 Mnemonics and Palindromes

    题目传送门 /* 题意:给出一个长为n的仅由小写英文字母组成的字符串,求它的回文串划分的元素的最小个数,并按顺序输出此划分方案 回文串+回溯:dp[i] 表示前i+1个字符(从0开始)最少需要划分的数 ...

  8. 分割回文串 · Palindrome Partitioning

    [抄题]: 给定一个字符串s,将s分割成一些子串,使每个子串都是回文串. 返回s所有可能的回文串分割方案. 给出 s = "aab",返回 [ ["aa", & ...

  9. [LeetCode] Palindrome Partitioning 拆分回文串

    Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...

随机推荐

  1. .netcore 写日志(使用NLog,log4net)

    参考地址: NLog:http://www.cnblogs.com/linezero/p/Logging.html Log4Net:http://www.cnblogs.com/linezero/p/ ...

  2. Java开发环境配置(2)--jdk配置和 多个JDK问题处理

    ==2018-8-15 16:41:06 更新 服务器 jdk1.6升级为1.8,没有卸载原来的1.6,直接安装1.8. 更改环境变量的 JAVA_HOME所指路径后, cmd 输入 java -ve ...

  3. Javascript - ExtJs - 数据

    数据(ExtJs Data) Ext.data命名空间 有关数据存储.读取的类都定义在Ext.data命名空间中.Ext的gridPanel.combobox的数据源都是来自Ext.data提供的类. ...

  4. JDK源码笔记--Object

    public final native Class<?> getClass(); public native int hashCode(); public boolean equals(O ...

  5. 8.3版本提示未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0 提供程序

    这个原因是8.3版本推出了64位程序,但是Access驱动在64位系统上默认是没有安装的,需要下载一个组件安装即可. 下载2010 Access 驱动程序:数据连接组件安装 http://www.ba ...

  6. Latex自定义文档纸张大小

    \usepackage{geometry} \special{papersize=8.5in,11in}%纸张大小为8.5inch×11inch

  7. Houdini OpenCL

    SOP: simple moveKernel #include "interpolate.h" float lerpConstant( constant float * in, i ...

  8. 嵌入式系统C编程之堆栈回溯【转】

    转自:https://www.cnblogs.com/clover-toeic/p/3949896.html 前言 在嵌入式系统C语言开发调试过程中,常会遇到各类异常情况.一般可按需添加打印信息,以便 ...

  9. webpack打包生成多个vendor的配置方法

    用webpack打包项目的时候,一般喜欢把一些公用的库打包的vendor.js里面,比如像react,react-router,redux等. 随着引入的库越来越多,vendor文件也变得越来越大,于 ...

  10. SQL SERVER 常见SQL和函数使用

    一.语法 参考原文:https://blog.csdn.net/xushaozhang/article/details/55053037 1.查询插入 (1)SELECT INTO 语句格式: Ora ...