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

最新文章

  1. java基础2_运算符,选择语句
  2. matlab常用的字符串操作函数之一
  3. --查询nvarchar(max)的表和字段
  4. Swift游戏实战-跑酷熊猫 05 踩踏平台是怎么炼成的
  5. h5 本地存储和读取信息
  6. AFNetworking vs ASIHTTPRequest vs MKNetworkKit
  7. COS中访问文件的三种方式
  8. cocos2dx 读取json及解析
  9. HW5.35
  10. 关于WebBrowser.DocumentCompleted事件
  11. 第一百一十八节,JavaScript,动态加载脚本和样式
  12. 5th-个人总结(Alpha阶段)
  13. 算法题:A除以B
  14. kafka-rest:A Comprehensive, Open Source REST Proxy for Kafka
  15. Java基础(Java补码)
  16. java 基础代码
  17. 用junit对java代码进行测试,需要注意
  18. cuda by example【读书笔记2】
  19. python中的函数对象的内存地址是多少
  20. 如何使用C语言的面向对象

热门文章

  1. [acmm week12]染色(容斥定理+组合数+逆元)
  2. 【BZOJ】1143: [CTSC2008]祭祀river
  3. Let&#39;s Encrypt 免费通配 https 签名证书 安装方法
  4. inviteflood 洪泛滥工具
  5. css_input[checked]复选框去掉默认样式并添加新样式
  6. stanfordCorenlp在python3中的安装使用+词性学习
  7. PHP对象3: public / private / protected
  8. ubuntu的su初始密码设置
  9. 在ubuntu中安装puppeteer
  10. C/C++——C语言库函数大全