当前位置:网站首页>UOJ#748-[UNR #6]机器人表演【dp】
UOJ#748-[UNR #6]机器人表演【dp】
2022-08-08 14:21:00 【QuantAsk】
正题
题目链接:https://uoj.ac/problem/748
题目大意
有一个长度为 n n n的 01 01 01序列,然后 t t t次插入一个 0 0 0和一个 1 1 1,要求 0 0 0在 1 1 1前面,求最终能得到多少种本质不同的串。
1 ≤ n , t ≤ 300 1\leq n,t\leq 300 1≤n,t≤300
解题思路
我们考虑一个 n + 2 × t n+2\times t n+2×t的 01 01 01串是否合法,而且我们最好能搞出一种记录信息最少且唯一的方法。
我们记录一个 x x x表示当前匹配到的位置,当我们加入一个 0 0 0或 1 1 1时,如果恰好能和下一个匹配,我们就匹配。否则如果是 0 0 0,我们再记录一个 y y y表示目前有多少个未匹配的 0 0 0。如果是 1 1 1,如果前面有未匹配的 0 0 0,我们就用未匹配的 0 0 0和这个 1 1 1匹配。
如果没有我们就一直让匹配位置 x x x往前走,直到出现一个未匹配的 0 0 0,我们可以先预处理出一个 p i p_i pi表示匹配位置 i i i往前跳到出现第一个未匹配 0 0 0的位置。
这种匹配方法一定是最优的,因为往前跳一到的位置一定是一个 0 0 0,而之后我们拿未匹配的 0 0 0去匹配这个 0 0 0显然不优秀。
然后我们设 f i , j , k f_{i,j,k} fi,j,k表示现在填到第 i i i个,目前匹配到位置 j j j,前面有 k k k个未匹配的 0 0 0时前面填的方案数转移即可。
时间复杂度: O ( n 3 ) O(n^3) O(n3)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=305,P=998244353;
int n,t,f[N*3][N][N],pre[N];
char s[N];
void Add(int &x,int y)
{
x=(x+y>=P)?(x+y-P):(x+y);}
int main()
{
// printf("%d\n",sizeof(f)>>20);
scanf("%d%d",&n,&t);
scanf("%s",s+1);pre[0]=-1;
for(int i=1;i<=n;i++){
int p=0;
for(int j=i;j>=1;j--){
if(s[j]=='1')p++;
else p--;
if(p==-1){
pre[i]=j-1;break;}
}
if(p!=-1)pre[i]=-1;
}
f[0][0][0]=1;
for(int i=0;i<n+2*t;i++)
for(int j=0;j<=n;j++)
for(int k=0;k<=t;k++){
if(!f[i][j][k])continue;
//zero
if(s[j+1]=='0')Add(f[i+1][j+1][k],f[i][j][k]);
else Add(f[i+1][j][k+1],f[i][j][k]);
//one
if(s[j+1]=='1')Add(f[i+1][j+1][k],f[i][j][k]);
else{
if(k)Add(f[i+1][j][k-1],f[i][j][k]);
else if(pre[j]!=-1)Add(f[i+1][pre[j]][k],f[i][j][k]);
}
}
printf("%d\n",f[n+2*t][n][0]);
return 0;
}
边栏推荐
猜你喜欢
HackTheBox | Previse
[Redis] Redis installation and use of client redis-cli (batch operation)
论文理解:“Self-adaptive loss balanced Physics-informed neural networks“
浅学一下二叉树链式存储结构的遍历
KMP Media Group South Africa implemented a DMS (Document Management System) to digitize the process, employees can again focus on their actual tasks, providing efficiency
sample function—R language
Verilog语法基础HDL Bits训练 09
Verilog HDL Bits training 09 grammar foundation
vsomeip环境搭建及helloworld测试例跑通
a += 1 += 1为什么是错的?
随机推荐
Shell Three Musketeers-----sed command
Code Casual Recording Notes_Dynamic Programming_322 Change Exchange
看三年的CRUD程序员如何解决数据库死锁的
手把手教你设计一个全局异常处理器
textarea disable drag and drop
「PHP基础知识」检测数据类型
serialize serialize native method
itk中图像2d-3d配准整理
PC端实用软件推荐
【小码匠自习室】重做ABC250-D, 我无力反抗
itk中生成drr整理
华为云云数据库RDS MySQL 版初试探【华为云至简致远】
mysql 查询一个字段为特定值,并且另一个字段的值出现两次的记录?
vijos1212 Way Selection
2022年8月7日 暑假第四周总结
现在网上开户安全么?接着证券开户选择哪个证券?
华为云弹性云服务器ECS使用【华为云至简致远】
PHP —— 用 ThinkPHP5.0 实现微信小程序登陆
作为一个十年卷王,告诫你们年轻人应该如何才能认清自己的价值
良心到难以置信的网站推荐第7期丨全程干货