【BZOJ 2121】字符串游戏
2024-10-20 16:40:32
http://www.lydsy.com/JudgeOnline/problem.php?id=2121
dp,设\(f(i,j,k,l)\)表示原串i到j这个子串能否被删成第k个串的长度为l的前缀。
再设\(can(i,j)\)表示原串i到j这个子串能否被删成空串,用can这个状态来加速f的转移即可。
时间复杂度\(O(|L|^3|S||p|)\),区间dp的转移都很少,所以可以过。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int L = 160;
const int N = 43;
const int p = 33;
bool f[L][L][N][p], can[L][L];
int n, len[N], Slen, dp[L];
char s[N][p], S[L];
int main() {
scanf("%s", S + 1);
Slen = strlen(S + 1);
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%s", s[i] + 1);
len[i] = strlen(s[i] + 1);
}
for (int i = Slen; i >= 1; --i)
for (int j = i; j <= Slen; ++j) {
for (int k = 1; k <= n; ++k) {
f[i][i - 1][k][0] = true;
for (int l = 1; l <= len[k] && l <= j - i + 1; ++l) {
f[i][j][k][l] |= f[i][j - 1][k][l - 1] && (s[k][l] == S[j]);
for (int tmp = i; tmp < j; ++tmp) f[i][j][k][l] |= f[i][tmp][k][l] && can[tmp + 1][j];
}
}
for (int k = 1; k <= n; ++k)
if (f[i][j][k][len[k]]) {
can[i][j] = true;
break;
}
}
for (int i = 1; i <= Slen; ++i) {
dp[i] = dp[i - 1] + 1;
for (int j = i; j >= 1; --j)
if (can[j][i])
dp[i] = min(dp[i], dp[j - 1]);
}
printf("%d\n", dp[Slen]);
return 0;
}
最新文章
- java基础2_运算符,选择语句
- matlab常用的字符串操作函数之一
- --查询nvarchar(max)的表和字段
- Swift游戏实战-跑酷熊猫 05 踩踏平台是怎么炼成的
- h5 本地存储和读取信息
- AFNetworking vs ASIHTTPRequest vs MKNetworkKit
- COS中访问文件的三种方式
- cocos2dx 读取json及解析
- HW5.35
- 关于WebBrowser.DocumentCompleted事件
- 第一百一十八节,JavaScript,动态加载脚本和样式
- 5th-个人总结(Alpha阶段)
- 算法题:A除以B
- kafka-rest:A Comprehensive, Open Source REST Proxy for Kafka
- Java基础(Java补码)
- java 基础代码
- 用junit对java代码进行测试,需要注意
- cuda by example【读书笔记2】
- python中的函数对象的内存地址是多少
- 如何使用C语言的面向对象
热门文章
- [acmm week12]染色(容斥定理+组合数+逆元)
- 【BZOJ】1143: [CTSC2008]祭祀river
- Let&#39;s Encrypt 免费通配 https 签名证书 安装方法
- inviteflood 洪泛滥工具
- css_input[checked]复选框去掉默认样式并添加新样式
- stanfordCorenlp在python3中的安装使用+词性学习
- PHP对象3: public / private / protected
- ubuntu的su初始密码设置
- 在ubuntu中安装puppeteer
- C/C++——C语言库函数大全