当前位置:网站首页>【UNR #6 B】机器人表演(DP)
【UNR #6 B】机器人表演(DP)
2022-08-10 00:52:00 【SSL_TJH】
机器人表演
题目链接:UNR #6 B
题目大意
给你一个 01 串,然后要你往里面插入 k 个 0 k 个 1,保证每插一个 1 的时候 0 的个数都大于等于 1 的个数。
问你有能形成多少种不同的字符串。
思路
两种想法,每次插 01,或者每次插 0 或 1,发现都不太好搞。
考虑直接一个一个重新建字符串,这样比较容易能 DP。
然后考虑怎么不会重复,那就能用给你的串就用给你的串。
然后不行的话会发现一个问题,就是如果你要放 1 1 1 但是前面 0 0 0 不够了,看似不行了但是你其实可以把之前给的 01 串拿出一些使够 1 1 1。
然后注意到你拿多少都可以(麻了比赛的时候以为只能拿一个然后就死命错,绷不住了),那我们肯定是在能找到 0 0 0 的前提下越少越好。
所以我们把 0 0 0 看做 − 1 -1 −1, 1 1 1 看做 + 1 +1 +1,那就是要找第一个后缀为 − 1 -1 −1 的位置,这个直接暴力找过去即可。
所以就是设 f i , j , k f_{i,j,k} fi,j,k 为当前字符串长度为 i i i,插了 j j j 个 0 0 0, k k k 个 1 1 1(自然给的字符串就用到了 i − j − k i-j-k i−j−k 的位置),然后按上面的转移即可。
代码
#include<cstdio>
#define mo 998244353
//#define mo 1000000007
using namespace std;
const int N = 301;
const int M = 901;
int n, t, a[N], f[M][N][N];
char s[N];
//f[i][j][k] 总共用了i个,j个0,k个1
int add(int x, int y) {
return x + y >= mo ? x + y - mo : x + y;}
int dec(int x, int y) {
return x < y ? x - y + mo : x - y;}
int mul(int x, int y) {
return 1ll * x * y % mo;}
int main() {
scanf("%d %d", &n, &t);
scanf("%s", s + 1); for (int i = 1; i <= n; i++) a[i] = s[i] - '0';
f[0][0][0] = 1;
for (int sum = 0; sum < n + t + t; sum++)
for (int j = 0; j <= t; j++)
for (int k = 0; k <= j; k++) {
int i = sum - j - k; if (i < 0 || i > n || !f[sum][j][k]) continue;
//0
if (i < n && a[i + 1] == 0) f[sum + 1][j][k] = add(f[sum + 1][j][k], f[sum][j][k]);
else if (j < t) f[sum + 1][j + 1][k] = add(f[sum + 1][j + 1][k], f[sum][j][k]);
//1
if (i < n && a[i + 1] == 1) f[sum + 1][j][k] = add(f[sum + 1][j][k], f[sum][j][k]);
else if (j > k && k < t) f[sum + 1][j][k + 1] = add(f[sum + 1][j][k + 1], f[sum][j][k]);
else if (j == k && j < t) {
int jj = 0, kk = 0, now = i, val = 0;
while (now && val != -1) {
if (!a[now--]) jj++, val--;
else kk++, val++;
}
if (val != -1 || j + jj > t || k + kk + 1 > t) continue;
f[sum + 1][j + jj][k + kk + 1] = add(f[sum + 1][j + jj][k + kk + 1], f[sum][j][k]);
}
}
printf("%d", f[n + t + t][t][t]);
return 0;
}
边栏推荐
- 不是吧,连公司里的卷王写代码都复制粘贴,这合理?
- 即时通讯开发如何撸一个WebSocket服务器
- OSS-访问oss生成的url无法访问,直接下载问题
- 将string类对象中的内容格式化到字符串Buffer中时遇到的异常崩溃分析
- -Pickling peanuts-
- Xi'an biotin-tetrapolyethylene glycol-amide-4phenol light yellow semi-solid
- [LeetCode] Find the sum of the numbers from the root node to the leaf node
- C语言头文件组织与包含原则
- 基于Web的疫情隔离区订餐系统
- Fedora 36 dnf 安装ModSecurity和 OWASP 核心规则集
猜你喜欢
What should I do if there is no sound after reinstalling the system in win10?
CAS:183896-00-6 (Biotin-PEG3-C3-NH2) PEG derivative
UI遍历的初步尝试
C language pointer practice questions
Involved in PEG-Biotin (CAS: 1778736-18-7) Biotin-PEG4-OH is widely used in molecular target detection
万字总结:分布式系统的38个知识点
【LeetCode】求根节点到叶节点数字之和
03|Process Control
Sikuli 基于图形识别的自动化测试技术
PEG derivative Biotin-PEG1-OH (cas: 95611-10-2, 2-biotinaminoethanol) advantage description
随机推荐
删除表空间数据文件
ABAP 里文件操作涉及到中文字符集的问题和解决方案
-Vector Dot Product-
对修饰器的实验支持功能在将来的版本中可能更改。在 “tsconfig“ 或 “jsconfig“ 中设置 “experimentalDecorators“ 选项以删除此警告
Unity image is blurry after using long image
[LeetCode] Find the sum of the numbers from the root node to the leaf node
多线程之自定义线程池
R语言使用cox函数构建生存分析回归模型、使用subgroupAnalysis进行亚组分析并可视化森林图
GB28181 sip和RTSP(Real-Time Streaming Protocol)实时流控制协议
Entity FrameWork Core教程,从基础应用到原理实战
高校就业管理系统设计与实现
即时通讯开发如何撸一个WebSocket服务器
PEG derivative Biotin-PEG1-OH (cas: 95611-10-2, 2-biotinaminoethanol) advantage description
365 days challenge LeetCode1000 questions - Day 052 Step by step summation to get the minimum value of positive numbers Greedy
【软考软件评测师】软件测试基础知识
mstsc/Mstsc (Microsoft terminal services client)远程桌面连接
3438. 数制转换
@PostConsturct注解作用及特点
SonarQube升级记录:7.8->7.9->8.9
为什么字符串一旦创建就不可以改变?