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 描 ...
随机推荐
- cocos代码研究(9)ProgressTimer类学习笔记
理论部分 ProgressTimer是Node的子类. 该类根据百分比来渲染显示内部的Sprite对象. 变化方向包括径向,水平或者垂直方向. 代码部分 Type getType () const获取 ...
- open-falcon api相关
本文描述通过被监控endpoint的名称获取该endpoint的eid和监控项,从而获取到该endpoint的监控历史数据,使用python代码的 api操作方法 注:同步open-falcon和ag ...
- Object-C开发之instancetype和id关键字
一.什么是instancetypeinstancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以用 ...
- 【运维技术】CentOS7上从零开始安装阿里RocketMQ版本:release-4.0.1【亲测哈哈】
CentOS7上从零开始安装阿里RocketMQ版本:release-4.0.1[亲测哈哈] 安装git # 更新包 $ yum update # 安装git $ yum install git # ...
- 【分页问题】elasticsearch 深分页问题以及解决方法
本文主要参考: 1.https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html ...
- [AHOI2008]上学路线
题意:给定一个无向图,删除某些边有一定的代价,要求删掉使得最短路径减小,求最小代价. 首先要spfa求出起点到各个点的最短距离.对于一条权值为w,起点为i,终点为j的边,设dis[k]为起点到k点的距 ...
- The P4 Language Specification v1.0.2 Introduction部分
Introduction P4 is a declarative language for expressing how packets are processed by the pipeline o ...
- Java中的组合与聚合
组合和聚合是有很大区别的,这个区别不是在形式上,而是在本质上:比如A类中包含B类的一个引用b,当A类的一个对象消亡时,b这个引用所指向的对象也同时消亡(没有任何一个引用指向它,成了垃圾对象),这种情况 ...
- Qt5_pro_02
1.g++ 编译参数 如果 用g++编译时,命令行是这样的:“g++ main.cpp -std=c++0x -pthread” 则在Qt的pro文件中这样设置: QMAKE_CXXFLAGS += ...
- SpringBoot.资料
1.du 搜 "springboot 视频" 2.SpringBoot视频教程_哔哩哔哩 (゜-゜)つロ 干杯_-bilibili.html(https://www.bilibil ...