BZOJ2121: 字符串游戏(DP)(字符串删单词,求最多可以删去多少)
2121: 字符串游戏
Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 672 Solved: 376
[Submit][Status][Discuss]
Description
Input
Output
输出一个整数,表示L的最短长度。
Sample Input
3
ac
abc
aaa
Sample Output
【样例说明】
aaabccd
aacd
ad
对于100%数据,满足|L|<151,|S|<31,S中的每个元素|p|<21
HINT
Source
思路:我们用f[i][j][k][l]表示第[i,j]这个区间能否删成第k个单词的前l位,用cov[i][j]表示[i,j]这个区间能否被完全删去。
复杂度O(N^3*S*p);
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int f[maxn][maxn][][],cov[maxn][maxn],dp[maxn];
char c[maxn],s[][]; int Len[];
int main()
{
int N,M;
scanf("%s",c+); N=strlen(c+);
scanf("%d",&M);
for(int i=;i<=M;i++){
scanf("%s",s[i]+);
Len[i]=strlen(s[i]+);
}
rep(i,,N) rep(j,,M) f[i][i-][j][]=; //匹配的时候需要边界条件
rep(len,,N)
rep(L,,N-len+){
int R=L+len-;
rep(i,,M){
rep(j,,Len[i]) if(c[R]==s[i][j]) f[L][R][i][j]|=f[L][R-][i][j-]; //匹配
rep(j,,Len[i]) rep(k,L+,R) //不匹配
f[L][R][i][j]|=(f[L][k-][i][j]&cov[k][R]);
}
rep(i,,M) cov[L][R]|=f[L][R][i][Len[i]];
}
rep(i,,N){ //背包得到最大值
rep(j,,i) if(cov[j][i]) rep(k,i,N) dp[k]=max(dp[k],dp[j-]+i-j+);
rep(j,i+,N) dp[j]=max(dp[j],dp[j-]);
}
printf("%d\n",N-dp[N]);
return ;
}
把int换成bool快了一倍,word天啦。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
bool f[maxn][maxn][][],cov[maxn][maxn];
char c[maxn],s[][];int Len[],dp[maxn];
int main()
{
int N,M;
scanf("%s",c+); N=strlen(c+);
scanf("%d",&M);
for(int i=;i<=M;i++){
scanf("%s",s[i]+);
Len[i]=strlen(s[i]+);
}
rep(i,,N) rep(j,,M) f[i][i-][j][]=; //匹配的时候需要边界条件
rep(len,,N)
rep(L,,N-len+){
int R=L+len-;
rep(i,,M){
rep(j,,Len[i]) if(c[R]==s[i][j]) f[L][R][i][j]|=f[L][R-][i][j-]; //匹配
rep(j,,Len[i]) rep(k,L+,R) //不匹配
f[L][R][i][j]|=(f[L][k-][i][j]&cov[k][R]);
}
rep(i,,M) cov[L][R]|=f[L][R][i][Len[i]];
}
rep(i,,N){ //背包得到最大值
rep(j,,i) if(cov[j][i]) rep(k,i,N) dp[k]=max(dp[k],dp[j-]+i-j+);
rep(j,i+,N) dp[j]=max(dp[j],dp[j-]);
}
printf("%d\n",N-dp[N]);
return ;
}
BZOJ2121: 字符串游戏(DP)(字符串删单词,求最多可以删去多少)的更多相关文章
- BZOJ 2121: 字符串游戏 区间DP + 思维
Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对 于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...
- BZOJ2121 字符串游戏
Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其 他一些字符串的集合S,然后他可以进行以下操作:对于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...
- CodeForces7D 字符串hash + dp
https://cn.vjudge.net/problem/20907/origin 长度是 n 的字符串 s,如果它自身是回文数,且它的长度为 的前缀和后缀是 (k - )-回文数,则它被称作 k- ...
- 20181228 模拟赛 T3 字符串游戏 strGame 博弈论 字符串
3 字符串游戏(strGame.c/cpp/pas) 3.1 题目描述 pure 和 dirty 决定玩 T 局游戏.对于每一局游戏,有n个字符串,并且每一局游戏由K轮组成.具体规则如下:在每一轮 ...
- QuickHit项目(输出字符串游戏)
public class leve { private int leveNo; private int strLength; private int strTimes; private int tim ...
- Codeforces Round #367 (Div. 2) A B C 暴力 二分 dp(字符串的反转)
A. Beru-taxi time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- Codeforces Beta Round #17 C. Balance (字符串计数 dp)
C. Balance time limit per test 3 seconds memory limit per test 128 megabytes input standard input ou ...
- hihoCoder #1320 : 压缩字符串 区间dp
/** 题目:hihoCoder #1320 : 压缩字符串 链接:https://hihocoder.com/problemset/problem/1320 描述 小Hi希望压缩一个只包含大写字母' ...
- 32-回文字符串(dp)
http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=37 回文字符串 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描 ...
随机推荐
- 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2018) Solution
A. Numbers Unsolved. B. Broken Watch Solved. 题意: 一个圆盘上,有等分的n块区域,有三根指针,当三根指针分别位于两块区域的交界处时 指针的三点相连会形成一 ...
- zw版【转发·台湾nvp系列Delphi例程】HALCON SqrtImage
zw版[转发·台湾nvp系列Delphi例程]HALCON SqrtImageHALCON SqrtImage 範例 (RAD Studio XE Delphi x64) zw版[转发·台湾nvp系列 ...
- 查看本地mysql安装路径
- Labeled Faces in the Wild 人脸识别数据集
http://blog.csdn.net/garfielder007/article/details/51480525 New (draft) survey paper: Labeled Faces ...
- SQL学习笔记八之ORM框架SQLAlchemy
阅读目录 一 介绍 二 创建表 三 增删改查 四 其他查询相关 五 正查.反查 一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进 ...
- 20135320赵瀚青LINUX第八周学习笔记
赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周学习的是linux ...
- linux内核分析第五周-分析system_call中断处理过程
本实验目的:通过以一个简单的menu小程序,跟踪系统调用的过程,分析与总结系统调用的机制和三层进入的过程. 实验原理:系统调用处理过程与中断处理的机制 系统调用是通过软中断指令 INT 0x80 实现 ...
- 20145204 《Java程序设计》第6周学习总结
20145204 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入/输出 数据流 I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据 ...
- 2017-2018-1 Java小组-1623 第一周作业
2017-2018-1 Java小组-1623 第一周作业 <构建之法>学习笔记及团队成员介绍 1. 学习内容 概论 个人技术和流程 软件工程师的成长 两人合作 团队和流程 敏捷流程 实战 ...
- FZU 2280 Magic(字符串Hash)题解
题意:给你n个字符串,每个字符串有一个值w,有q次询问,一共两种操作:一是“1 x y”表示把第x个串的w变为y:二是“2 x”,输出第x个串能放几次魔法.放魔法的条件是这样:用串x放魔法,如果在1~ ...