题目链接:洛谷

以后还是要多打CF,不然就会错过这些很好的思维题了。我dp学得还是太烂,要多总结。


首先$len=1$就直接输出0.

我们考虑$dp[i][j]$表示前$i$个数的答案,而且第$i$个数要选$j$,$ans[i]=\sum_{j=1}^kdp[i][j]$

而且$del[j]$表示前$i$个数中,末尾的$j$刚好出现$len-1$次的好的数列,目的是为后面下一步dp作铺垫(雾)

$$dp[i][j]=ans[i-1]-del[j]$$

$$ans[i]+=dp[i][j]$$

$$del[j]=ans[i-len+1]-dp[i-len+1][j]$$

注意上面的先后顺序是不能改变的。

但是第三条方程必须要保证前面至少要有连续$len-1$个可能的$j$,否则就不行。这需要一个$cnt[]$数组来维护

U2FsdGVkX18i7uuFtRXRKp4L3/XpHCArvYcxfRh5nSDoA+n72JMYCjGy/WnhKn/F
Cn+w2+0U2JWHEtAnfU8mxjc/R841pS9cOdnyf8OE28K1vI1RFtlJCsIKUoMfyYJg
gKaptA14c9ysJFLbpKJ7KjCwHLy4s+fx0gE2joNiLvNFcSQzayv4Dx1w3dtaQbM9
TwBumGo4LA
 #include<cstdio>
#define Rint register int
using namespace std;
typedef long long LL;
const int N = , mod = ;
int n, k, len, a[N], cnt[N], del[N], dp[N][], ans[N];
int main(){
scanf("%d%d%d", &n, &k, &len);
if(len == ){puts(""); return ;}
for(Rint i = ;i <= n;i ++) scanf("%d", a + i);
ans[] = ;
for(Rint i = ;i <= n;i ++)
for(Rint j = ;j <= k;j ++)
if(a[i] == - || a[i] == j){
dp[i][j] = (ans[i - ] - del[j] + mod) % mod;
++ cnt[j];
if(cnt[j] >= len - ) del[j] = (ans[i - len + ] - dp[i - len + ][j] + mod) % mod;
ans[i] = (ans[i] + dp[i][j]) % mod;
} else del[j] = cnt[j] = ;
printf("%d\n", ans[n]);
}

CF1093F

CF1093F Vasya and Array的更多相关文章

  1. CF1093F Vasya and Array DP

    题面 题面 \(\Delta\)题面有点问题,应该是数列中没有长度大于等于\(len\)的连续数字才是合法的. 题解 设\(f[i][j]\)表示DP到\(i\)位,以\(j\)为结尾的方案数, \( ...

  2. Educational Codeforces Round 56 (Rated for Div. 2) F - Vasya and Array dp好题

    F - Vasya and Array dp[ i ][ j ] 表示用了前 i 个数字并且最后一个数字是 j 的方案数. dp[ i ][ j ] = sumdp [i - 1 ][ j ], 这样 ...

  3. CodeForces - 1093F:Vasya and Array (DP&计数)

    题意:N,K,L,以及给定长度为N的序列,表示其对应的颜色,-1表示还没有涂色,现在让你去涂色,使得最后没有大于等于L的连续的同色的情况. 思路:我们用dp[i][j]表示第i个位置颜色为j的合法方案 ...

  4. 【CF1187C】Vasya And Array

    题目大意:给定一个长度为 N 的数组,以及 M 个区间,给出的区间有两个性质,性质一是给定区间中的元素单调不减,性质二是给定区间中的元素存在相邻单调减的元素对,求构造一个符合给定区间条件的序列,若不存 ...

  5. Educational Codeforces Round 56 (Rated for Div. 2) F. Vasya and Array

    题意:长度为n的数组,数组中的每个元素的取值在1-k的范围内或者是-1,-1代表这个元素要自己选择一个1-k的数字去填写,然后要求填完的数组中不能出现连续长度大于len的情况,询问填空的方案数. 题解 ...

  6. CodeForces 1093F Vasya and Array

    题意 给一个长度为 \(n\) 的整数序列 \(a\),其中 \(a_i\) 要么为 \(-1\),要么为 \(1\sim k\) 中的整数. 求出将所有 \(-1\) 替换为 \(1\sim k\) ...

  7. Educational Codeforces Round 56 Solution

    A. Dice Rolling 签到. #include <bits/stdc++.h> using namespace std; int t, n; int main() { scanf ...

  8. codeforce452DIV2——E. Segments Removal

    题目 Vasya has an array of integers of length n. Vasya performs the following operations on the array: ...

  9. Educational Codeforces Round 67

    Educational Codeforces Round 67 CF1187B Letters Shop 二分 https://codeforces.com/contest/1187/submissi ...

随机推荐

  1. 【原创】大叔经验分享(26)hive通过外部表读写elasticsearch数据

    hive通过外部表读写elasticsearch数据,和读写hbase数据差不多,差别是需要下载elasticsearch-hadoop-hive-6.6.2.jar,然后使用其中的EsStorage ...

  2. JavaScript入门学习笔记(二)

    JavaScript运算符: 算术运算符.赋值运算符和字符串连接运算符. 算法运算符与复制运算符用法参照Java: 字符串运算符: +运算符用于把文本值或字符串变量连接起来,适用于两个或更多字符串变量 ...

  3. Python知识目录

    目录 一.计算机基础 二.Python基础 三.函数 四.常用模块 五.模块和包 六.面向对象 七.网络编程socket 八.数据库 九.前端 十.Python Web框架 十一.版本控制--GIT ...

  4. 一个div实现白眼效果

    巧妙利用border和background-clip   <div class="eye"></div> .eye{ width:150px; height ...

  5. Sublime编译器快捷键大全

    Ctrl+Shift+P:打开命令面板 Ctrl+P:搜索项目中的文件 Ctrl+G:跳转到第几行 Ctrl+W:关闭当前打开文件 Ctrl+Shift+W:关闭所有打开文件 Ctrl+Shift+V ...

  6. SDOI2019 省选前模板整理

    目录 计算几何✔ DP 斜率优化✔ 四边形不等式✔ 轮廓线DP✘ 各种分治 CDQ分治✔ 点分治✔ 整体二分✔ 数据结构 线段树合并✔ 分块✔ K-D Tree LCT 可持久化Trie✔ Splay ...

  7. 我的 FPGA 学习历程(06)—— 二进制转格雷码

    格雷码是一种无权编码,其特点是相邻的两数之间只有一个位不同,像这样: 000-->001-->011-->010-->110-->111-->101-->10 ...

  8. Linux 安装zookeeper

    分享到:   1.下载zokeeper 1.1 官网下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/ 1.2 链接:https:/ ...

  9. HDU 2009 求数列的和

    题目链接:HDU 2009 Description 数列的定义如下: 数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和. Input 输入数据有多组,每组占一行,由两个整数n(n< ...

  10. 关于Android文件Apk下载的那点事

    1.Android文件Apk下载变ZIP压缩包解决方案 如果你的下载服务器为Nginx服务器,那么,在Nginx安装目录下的conf/mime.types文件的对应位置,加上以下一行语句,指定APK文 ...