题目背景

小$A$和小$B$是一对好朋友,他们经常一起愉快的玩耍。最近小$B$沉迷于**师手游,天天刷本,根本无心搞学习。
但是小$B$已经入坑了几个月,却一次都没有抽到$SSR$,让他非常怀疑人生。
勤勉的小$A$为了劝说小$B$早日脱坑,认真学习,决定以抛硬币的形式让小$B$明白他是一个彻彻底底的非洲人,从而对这个游戏绝望。


题目传送门(内部题43)


输入格式

一行一个字符串$S$,字符集为所有小写字母。第二行一个数$L$如题意。


输出格式

一行一个数,表示本质不同的长度为$L$的子序列个数,答案对$998244353$取模。


样例

样例输入:

addeade
3

样例输出:

19


数据范围与提示

我们定义$|S|$为串$S$的长度。
对于$10\%$的数据,$S$只由一种字符构成。
对于另$40\%$的数据,满足$|S|,L\leqslant 15$。
对于另$20\%$的数据,满足$|S|,L\leqslant 100$。
对于全部$100\%$的数据,满足$|S|,L\leqslant 3,000$。


题解

题看起来有点虎人,但是仔细一想并不难。

依然考虑$DP$。

设$dp[i][j]$表示处理完$S$的前$i$为,长度为$j$的本质不同的子序列的个数。

如果不考虑本质不同,那么转移将是$dp[i][j]=dp[i-1][j]+dp[i-1][j-1]$。

现在来考虑减去重复的部分。

设当前位$i$的字符为$s_i$,$s_i$的上一次出现的位置是$p$,那么以$s_p$结尾的串与算重的串一一对应。

那么我们就需要减去$dp[p-1][j-1]$。

于是,最终的状态转移方程是:$dp[i][j]=dp[i-1][j]+dp[i-1][j-1]-dp[p-1][j-1]$。

时间复杂度:$\Theta({|S|}^2)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
char ch[3001];
int S[3001],L;
int pre[3001];
long long dp[3001][3001];
int main()
{
scanf("%s%d",ch+1,&L);
S[0]=strlen(ch+1);
for(int i=1;i<=S[0];i++)
S[i]=ch[i]-'a'+1;
for(int i=1;i<=S[0];i++)
for(int j=i-1;j;j--)
if(S[i]==S[j]){pre[i]=j;break;}
dp[0][0]=1;
for(int i=1;i<=S[0];i++)
{
dp[i][0]=1;
for(int j=1;j<=min(i,L);j++)
dp[i][j]=(dp[i-1][j]+dp[i-1][j-1]-(pre[i]?dp[pre[i]-1][j-1]:0)+998244353)%998244353;
}
printf("%lld",dp[S[0]][L]);
return 0;
}

rp++

[CSP-S模拟测试]:抛硬币(DP)的更多相关文章

  1. [CSP-S模拟测试]:B(DP+数学)

    题目传送门(内部题45) 输入格式 第一行$3$个整数$n,m,P$.第二行$m$个整数,表示$m$次询问. 输出格式 一行$m$个整数表示答案. 样例 样例输入1: 2 4 40 1 2 3 样例输 ...

  2. [CSP-S模拟测试]:蛇(DP+构造+哈希)

    题目传送门(内部题140) 输入格式 前两行有两个长度相同的字符串,描述林先森花园上的字母. 第三行一个字符串$S$. 输出格式 输出一行一个整数,表示有多少种可能的蛇,对$10^9+7$取模. 样例 ...

  3. [CSP-S模拟测试]:最小值(DP+乱搞)

    题目背景 $Maxtir$更喜欢序列的最小值. 题目传送门(内部题128) 输入格式 第一行输入一个正整数$n$和四个整数$A,B,C,D$. 第二行输入$n$个整数,第$i$个数表示$a_i$. 输 ...

  4. [CSP-S模拟测试]:花(DP)

    题目传送门(内部题111) 输入格式 一个整数$T$,表示测试数据组数. 每组测试数据占一行,两个整数,分别表示$L$和$S$. 输出格式 对每组数据,输出一个整数表示答案. 样例 样例输入1: 13 ...

  5. [CSP-S模拟测试]:计数(DP+记忆化搜索)

    题目描述 既然是萌萌哒$visit\text{_}world$的比赛,那必然会有一道计数题啦!考虑一个$N$个节点的二叉树,它的节点被标上了$1\sim N$的编号.并且,编号为$i$的节点在二叉树的 ...

  6. [CSP-S模拟测试]:matrix(DP)

    题目描述 求出满足以下条件的$n\times m$的$01$矩阵个数:(1)第$i$行第$1~l_i$列恰好有$1$个$1$.(2)第$i$行第$r_i~m$列恰好有$1$个$1$.(3)每列至多有$ ...

  7. [CSP-S模拟测试]:题(DP+数学)

    题目描述 出个题就好了.这就是出题人没有写题目背景的原因.你在平面直角坐标系上.你一开始位于$(0,0)$.每次可以在上/下/左/右四个方向中选一个走一步.即:从$(x,y)$走到$(x,y+1),( ...

  8. [CSP-S模拟测试]:题(DP)

    题目描述 由于出题人赶时间所以没办法编故事来作为背景.一开始有$n$个苹果,$m$个人依次来吃苹果,第$i$个人会尝试吃$u_i$或$v_i$号苹果,具体来说分三种情况.$\bullet 1.$两个苹 ...

  9. [CSP-S模拟测试]:y(DP+bitset)

    题目背景 $\frac{1}{4}$遇到了一道水题,叕完全不会做,于是去请教小$D$.小$D$懒得理$\frac{1}{4}$,直接就离开了.于是,$\frac{1}{4}$只好来问你,这道题是这样的 ...

随机推荐

  1. Python读取文件时出现UnicodeDecodeError 'gbk' codec can't decode byte 0x80 in position x

    Python在读取文件时 with open('article.txt') as f: # 打开新的文本 text_new = f.read() # 读取文本数据出现错误: UnicodeDecode ...

  2. LOJ 2721 「NOI2018」屠龙勇士——扩展中国剩余定理

    题目:https://loj.ac/problem/2721 1.注意别一输入 p[ i ] 就 a[ i ] %= p[ i ] ,因为在 multiset 里找的时候还需要真实值. 2.注意用 m ...

  3. [CSP-S模拟测试]:密州盛宴(贪心)

    江城子·密州出猎老夫聊发少年狂,左牵黄,右擎苍,锦帽貂裘,千骑卷平冈.为报倾城随太守,亲射虎,看孙郎.酒酣胸胆尚开张,鬓微霜,又何妨!持节云中,何日遣冯唐?会挽雕弓如满月,西北望,射天狼.(这首词通过 ...

  4. php关键字static使用

    php中static关键字使用: 情景1:静态变量 使用static关键字定义静态变量 静态变量:只存在于函数作用域内,也就是说,静态变量只存活在栈中.一般的函数内变量在函数结束后会释放,比如局部变量 ...

  5. PHP抓取远程图片到本地保存(如何把错误信息用text文件写入)

    最近在工作中需要开发了一个用户素材功能,里面需要将网上的各种图片素材进行本地化存储.于是在网上找了一些相关资料,并根据自身开发需要,整理了一下主要的逻辑代码. /** * PHP将网页上的图片攫取到本 ...

  6. 【html】 两栏对比网页,同时滚动

    有的时候需要左右对比环境,而且希望能同时滚动,如下这么拼接就可以了 <html> <head><meta http-equiv="content-type&qu ...

  7. spring data jpa 多对多查询

    package com.ytkj.dao; import com.ytkj.entity.Customer; import com.ytkj.entity.Role; import org.sprin ...

  8. Cocos2d-x之Log输出机制

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 在cocos2d-x中,我们使用log这个函数进行输出,log可以输出很多参数,它的使用方式就和使用c语言中的printf的使用方式差不多 ...

  9. python-javascript之dom

    DOM DOM:(document object mode)文档对象模型.DOM为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构. 目的就是为了能让js操作html元素而制定的一个规范 DO ...

  10. linux 部署系统通过SecureCRT启动tomcat 控制台中文乱码

    查资料又是查了半天 首先 查看linux 当前系统字符集命令 echo $LANG 查看linux 当前系统语言 locale 网上说的又是下中文包,又是改临时语言,这些不能一概而论,我也觉得我不是中 ...