题目链接:http://codeforces.com/contest/1140/problem/E

题目大意:

如果一个数组的存在一个奇数长的回文就不好。

不是不好的数组是好的。

你可以把-1用1到k中一个数替换。问可以有多少种不同的好数组。

开虚拟赛最后一分钟把它A了,很开心,很开心。

思路:

我们翻译一下,如果存在长度为5的回文就必须会出现长度为3的回文。

也就是说不能出现长度为3回文。

也就是说x[i]!=x[i+2],x[i]!=x[i-2];(x[i]为输入数组)

那我们把数组分为两个数组,按奇偶分。(1,3,5,,,)(2,4,6,,,)

这两个数组就都要满足一个条件x[i]!=x[1+i]&&x[i]!=x[i-1];(相邻两个数不能相等)

然后我们就开始DP啦。

对于奇偶两个数组我就分析一个啦,因为都差不多。(相邻两个数不能相等)

首先,当然是n*k的DP。

DP[a][b]表示到a下为b的方案数。

所以DP[a][b]等于所有DP[a-1][i](1<=i<=k,i!=b)的和。

如果x[a]为-1,就算所有的1到k。

如果x[a]>0,就只算DP[a][x[a]];

这个可以理解吗?

可以理解就太好了!!!

然而,你在DP的过程中,发现DP[a][i](1<=i<=k)中只可能有两个不同的值(不会超过3个),而且产生不同的值是一个特殊的位置。

你可以先拿小一点的数据打表看看。

也就是说,对于每一个状态。只有两种可能,而不是k种可能。

所以,我们就可以写O(n)的DP了。

我画了两张图给你们看看。

然后到了愉快的贴代码时间了。不是很懂可以私聊QQ:1328247116,也可以下面留言。~~

#include <bits/stdc++.h>
using namespace std; #define int long long
#define IOS ios::sync_with_stdio(false);
#define endl "\n"
#define MAX 200050
#define mod 998244353 ///
int x[MAX];
int dp[MAX];
int dp_1=,dp_1_sum=;
int dp_2=,dp_2_sum=;
int ans[MAX];
///
signed main()
{
IOS; int n,m;
cin>>n>>m;
for(int i=;i<=n;i++){
cin>>x[i];
} if(x[]>){
dp[]=;
dp_1=x[],dp_1_sum=;
}
else{
dp[]=;
dp_1=,dp_1_sum=;
} for(int i=;i<=n;i+=){
if(x[i]>){
if(x[i]==dp_1){
dp_1_sum=(m-)*dp[i-]%mod;
}
else{
dp_1_sum=((m-)*dp[i-]%mod+dp_1_sum)%mod;
}
dp_1=x[i];
}
else{
dp[i]=((m-)*dp[i-]%mod+dp_1_sum)%mod;
dp_1_sum=(m-)*dp[i-]%mod;
}
} ///
if(x[]>){
dp[]=;
dp_2=x[],dp_2_sum=;
}
else{
dp[]=;
dp_2=,dp_2_sum=;
} for(int i=;i<=n;i+=){
if(x[i]>){
if(x[i]==dp_2){
dp_2_sum=(m-)*dp[i-]%mod;
}
else{
dp_2_sum=((m-)*dp[i-]%mod+dp_2_sum)%mod;
}
dp_2=x[i];
}
else{
dp[i]=((m-)*dp[i-]%mod+dp_2_sum)%mod;
dp_2_sum=(m-)*dp[i-]%mod;
}
}
int ans;
if(n%==){
ans=(dp_1_sum+(m-)*dp[n-]%mod)*(dp_2_sum+(m-)*dp[n]%mod)%mod;
}
else{
ans=(dp_1_sum+(m-)*dp[n]%mod)*(dp_2_sum+(m-)*dp[n-]%mod)%mod;
}
cout<<ans;
return ;
} /* */

codeforces 1140E Palindrome-less Arrays的更多相关文章

  1. Codeforces 486C Palindrome Transformation(贪心)

    题目链接:Codeforces 486C Palindrome Transformation 题目大意:给定一个字符串,长度N.指针位置P,问说最少花多少步将字符串变成回文串. 解题思路:事实上仅仅要 ...

  2. codeforces 486C. Palindrome Transformation 解题报告

    题目链接:http://codeforces.com/problemset/problem/486/C 题目意思:给出一个含有 n 个小写字母的字符串 s 和指针初始化的位置(指向s的某个字符).可以 ...

  3. Codeforces 335B Palindrome

    http://codeforces.com/contest/335/problem/B 题意:  给定一个长度不超过5*10^4的只包含小写字母的字符串,要求你求它的回文子序列,如果存在长度为100的 ...

  4. Codeforces 159D Palindrome pairs

    http://codeforces.com/problemset/problem/159/D 题目大意: 给出一个字符串,求取这个字符串中互相不覆盖的两个回文子串的对数. 思路:num[i]代表左端点 ...

  5. Codeforces 932G Palindrome Partition - 回文树 - 动态规划

    题目传送门 通往???的传送点 通往神秘地带的传送点 通往未知地带的传送点 题目大意 给定一个串$s$,要求将$s$划分为$t_{1}t_{2}\cdots t_{k}$,其中$2\mid k$,且$ ...

  6. Codeforces 915 G Coprime Arrays

    Discipntion Let's call an array a of size n coprime iff gcd(a1, a2, ..., an) = 1, where gcd is the g ...

  7. codeforces 486C Palindrome Transformation 贪心求构造回文

    点击打开链接 C. Palindrome Transformation time limit per test 1 second memory limit per test 256 megabytes ...

  8. CodeForces 486C Palindrome Transformation 贪心+抽象问题本质

    题目:戳我 题意:给定长度为n的字符串,给定初始光标位置p,支持4种操作,left,right移动光标指向,up,down,改变当前光标指向的字符,输出最少的操作使得字符串为回文. 分析:只关注字符串 ...

  9. Codeforces 932G Palindrome Partition 回文树+DP

    题意:给定一个串,把串分为偶数段 假设分为$s_1,s_2,s_3....s_k$ 求满足$ s_1=s_k,s_2=s_{ k-1 }... $的方案数模$10^9+7$ $|S|\leq 10^6 ...

随机推荐

  1. 【转】[置顶] 在Android中显示GIF动画

    gif图动画在Android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以我也想弄一个.经过我多方的搜索资料和整理,终于弄出来了,其实github上有很多开源的gif的展示 ...

  2. Java基础加强之代理

    本文引用自 http://www.cnblogs.com/xdp-gacl/p/3971367.html 1.什么是代理 动态代理技术是整个java技术中最重要的一个技术,它是学习java框架的基础, ...

  3. Day2 数据类型和运算符

    基本数据类型 Java 是一种强类型的语言,声明变量时必须指明数据类型.变量(variable)的值占据一定的内存空间.不同类型的变量占据不同的大小.Java中共有8种基本数据类型,包括4 种整型.2 ...

  4. 利用Python实现12306爬虫--查票

    在上一篇文章(http://www.cnblogs.com/fangtaoa/p/8321449.html)中,我们实现了12306爬虫的登录功能,接下来,我们就来实现查票的功能. 其实实现查票的功能 ...

  5. virtualbox+vagrant学习-2(command cli)-19-vagrant box命令

    Status 格式: vagrant status [name|id] options只有 -h, --help 这将告诉你vagrant正在管理的机器的状态. 很容易就会忘记你的vagrant机器是 ...

  6. 【PHP笔试题】

    1.以下脚本输出什么? $s = '12345'; $m = 'a2b1c'; $s[$s[$m]] = '3'; echo $s; [ ] A.12345 [ ] B.12235 [ ] C.223 ...

  7. iOS - dispatch_after解说

    dispatch_after 是来延迟执行的GCD方法,因为在主线程中我们不能用sleep来延迟方法的调用,所以用dispatch_after是最合适的 dispatch_after 能让我们添加进队 ...

  8. JQuery的ajax函数执行失败,alert函数弹框一闪而过

    先查看<form>标签是否有action属性,如果没有,并且最后<button>标签的type属性为'submit‘时,默认提交位置就是当前页面 如果在页面右键检查,点击网络, ...

  9. x01.calc: 编程语言

    想写终极程序,大都去写操作系统或编程语言了.编程语言可以极其复杂如C,也可以极简,只处理加减乘除如 calc. 1. 词法分析 %{ #include <stdio.h> #include ...

  10. 20145234黄斐《Java程序设计》MyDC

    http://git.oschina.net/jiataiji/java