codeforces 1140E Palindrome-less Arrays
题目链接: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的更多相关文章
- Codeforces 486C Palindrome Transformation(贪心)
题目链接:Codeforces 486C Palindrome Transformation 题目大意:给定一个字符串,长度N.指针位置P,问说最少花多少步将字符串变成回文串. 解题思路:事实上仅仅要 ...
- codeforces 486C. Palindrome Transformation 解题报告
题目链接:http://codeforces.com/problemset/problem/486/C 题目意思:给出一个含有 n 个小写字母的字符串 s 和指针初始化的位置(指向s的某个字符).可以 ...
- Codeforces 335B Palindrome
http://codeforces.com/contest/335/problem/B 题意: 给定一个长度不超过5*10^4的只包含小写字母的字符串,要求你求它的回文子序列,如果存在长度为100的 ...
- Codeforces 159D Palindrome pairs
http://codeforces.com/problemset/problem/159/D 题目大意: 给出一个字符串,求取这个字符串中互相不覆盖的两个回文子串的对数. 思路:num[i]代表左端点 ...
- Codeforces 932G Palindrome Partition - 回文树 - 动态规划
题目传送门 通往???的传送点 通往神秘地带的传送点 通往未知地带的传送点 题目大意 给定一个串$s$,要求将$s$划分为$t_{1}t_{2}\cdots t_{k}$,其中$2\mid k$,且$ ...
- 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 ...
- codeforces 486C Palindrome Transformation 贪心求构造回文
点击打开链接 C. Palindrome Transformation time limit per test 1 second memory limit per test 256 megabytes ...
- CodeForces 486C Palindrome Transformation 贪心+抽象问题本质
题目:戳我 题意:给定长度为n的字符串,给定初始光标位置p,支持4种操作,left,right移动光标指向,up,down,改变当前光标指向的字符,输出最少的操作使得字符串为回文. 分析:只关注字符串 ...
- 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 ...
随机推荐
- class , field , method
Class类 由于Class类没有公共构造方法,所以创建Class的对象的方法有以下几种: 1.通过Class.forName静态方法返回Class类的一个实例 2.通过类名.class来获取一个Cl ...
- NSPredicate的使用
简述 NSPredicate谓词条件过滤器,一般用于过滤数组数据,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 常用函数 创建谓词 + (NSPredicate *)predic ...
- ubuntu16.04常见的问题解决方案
问题一:关于咖啡主机和其他服务器厂商和个人虚拟机VM10安装ubuntu16.04 ubuntu16.04默认是没有root用户的,要想有必须要通过用户创建,通常安装ubuntu16.04会有个让你创 ...
- C++矩阵库 Eigen 简介
最近需要用 C++ 做一些数值计算,之前一直采用Matlab 混合编程的方式处理矩阵运算,非常麻烦,直到发现了 Eigen 库,简直相见恨晚,好用哭了. Eigen 是一个基于C++模板的线性代数库, ...
- sqlite学习笔记8:C语言中使用sqlite之创建表
前面已经说了怎样打开和关闭数据库,这次要说得是怎样运行SQL语句,来创建一张表. 要用的的函数: sqlite3_exec(sqlite3* db, const char *sql, sqlite_c ...
- Math(初学)
package day01; public class Case12 { public static void main(String[] args) { System.out.println(Mat ...
- Linux学习笔记(第十二章)
grep进阶 grep:以整行为单位进行截取 截取的特殊符号 正规表示法特殊字符 注意: sed用法 格式化打印 awk 用法 diff档案对比: path旧文档升级为新文档
- uniapp开发踩坑记录
数组绑定class的问题 版本:v1.5.4 自定义了一个icon的组件,部分代码如下 <template> <text :class="[name, icon]" ...
- 三层BP神经网络的python实现
这是一个非常漂亮的三层反向传播神经网络的python实现,下一步我准备试着将其修改为多层BP神经网络. 下面是运行演示函数的截图,你会发现预测的结果很惊人! 提示:运行演示函数的时候,可以尝试改变隐藏 ...
- easybcd删除win10启动项如何恢复?
制作windows启动盘: u盘启动 开始安装,选择左下角的"修复计算机": 运行命令 bcdboot c:\windows /l zh-cn 从系统盘C:\Windows目录中复 ...