【UNR #6 B】机器人表演(DP)

机器人表演

题目链接:UNR #6 B

题目大意

给你一个 01 串,然后要你往里面插入 k 个 0 k 个 1,保证每插一个 1 的时候 0 的个数都大于等于 1 的个数。
问你有能形成多少种不同的字符串。

思路

两种想法,每次插 01,或者每次插 0 或 1,发现都不太好搞。
考虑直接一个一个重新建字符串,这样比较容易能 DP。

然后考虑怎么不会重复,那就能用给你的串就用给你的串。
然后不行的话会发现一个问题,就是如果你要放 1 但是前面 0 不够了,看似不行了但是你其实可以把之前给的 01 串拿出一些使够 1
然后注意到你拿多少都可以(麻了比赛的时候以为只能拿一个然后就死命错,绷不住了),那我们肯定是在能找到 0 的前提下越少越好。
所以我们把 0 看做 11 看做 +1,那就是要找第一个后缀为 1 的位置,这个直接暴力找过去即可。
所以就是设 fi,j,k 为当前字符串长度为 i,插了 j0k1(自然给的字符串就用到了 ijk 的位置),然后按上面的转移即可。

代码

#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; }

__EOF__

本文作者あおいSakura
本文链接https://www.cnblogs.com/Sakura-TJH/p/UNR_6_B.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   あおいSakura  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示