题目链接:

http://www.codeforces.com/contest/476/problem/E

E. Dreamoon and Strings

time limit per test 1 second
memory limit per test 256 megabytes
#### 问题描述
> Dreamoon has a string s and a pattern string p. He first removes exactly x characters from s obtaining string s' as a result. Then he calculates that is defined as the maximal number of non-overlapping substrings equal to p that can be found in s'. He wants to make this number as big as possible.
>
> More formally, let's define as maximum value of over all s' that can be obtained by removing exactly x characters from s. Dreamoon wants to know for all x from 0 to |s| where |s| denotes the length of string s.
#### 输入
> The first line of the input contains the string s (1 ≤ |s| ≤ 2 000).
>
> The second line of the input contains the string p (1 ≤ |p| ≤ 500).
>
> Both strings will only consist of lower case English letters.
#### 输出
> Print |s| + 1 space-separated integers in a single line representing the for all x from 0 to |s|.
#### 样例
> **sample input**
> aaaaa
> aa
>
> **sample output**
> 2 2 1 1 0 0

题意

给你一个文本串和一个模板串,求文本串删掉k(k=0,1,...,n)个字母后的最大不重叠子串个数。

题解

dp[i][j]表示前i个删掉j个字母后能得到的最大不重叠子串个数。

求出s1[i]结尾的往前能匹配到的位置,然后考虑这个匹配选和不选两种情况转移。

初始化的时候注意一点。

代码

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define ptf printf typedef long long LL;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef vector<pair<int, int> > VPII; const int INF = 0x3f3f3f3f;
const LL INFL = 0x3f3f3f3f3f3f3f3fLL;
const double eps = 1e-8;
const double PI = acos(-1.0); //start---------------------------------------------------------------------- const int maxn = 2222; char s1[maxn],s2[maxn];
int dp[maxn][maxn];
int l1,l2; int match(int i){
int j=l2,ret=0;
while(i>0&&j>0){
if(s1[i]==s2[j]) j--;
else ret++;
i--;
}
if(j==0) return ret;
else return -1;
} void init(){
rep(i,0,maxn) rep(j,0,maxn) dp[i][j]=-INF;
rep(i,0,maxn){
for(int j=0;j<=i;j++){
dp[i][j]=0;
}
}
} int main() {
scanf("%s%s",s1+1,s2+1);
l1=strlen(s1+1),l2=strlen(s2+1);
init();
for(int i=1;i<=l1;i++){
int ret=match(i);
//不选
for(int k=0;k<=i;k++){
dp[i][k]=max(dp[i][k],dp[i-1][k]);
}
if(ret<0) continue;
int j=i-ret-l2;
//选
for(int k=0;k<=i;k++){
if(k>=ret) dp[i][k]=max(dp[i][k],dp[j][k-ret]+1);
}
}
for(int i=0;i<=l1;i++) if(dp[l1][i]<0) dp[l1][i]=0;
for(int i=0;i<l1;i++) printf("%d ",dp[l1][i]);
printf("%d\n",dp[l1][l1]);
return 0;
} //end-----------------------------------------------------------------------

Codeforces Round #272 (Div. 2) E. Dreamoon and Strings dp的更多相关文章

  1. Codeforces Round #272 (Div. 2) E. Dreamoon and Strings 动态规划

    E. Dreamoon and Strings 题目连接: http://www.codeforces.com/contest/476/problem/E Description Dreamoon h ...

  2. Codeforces Round #272 (Div. 2) B. Dreamoon and WiFi dp

    B. Dreamoon and WiFi 题目连接: http://www.codeforces.com/contest/476/problem/B Description Dreamoon is s ...

  3. Codeforces Round #272 (Div. 2) D. Dreamoon and Sets 构造

    D. Dreamoon and Sets 题目连接: http://www.codeforces.com/contest/476/problem/D Description Dreamoon like ...

  4. Codeforces Round #272 (Div. 2) A. Dreamoon and Stairs 水题

    A. Dreamoon and Stairs 题目连接: http://www.codeforces.com/contest/476/problem/A Description Dreamoon wa ...

  5. Codeforces Round #272 (Div. 1) A. Dreamoon and Sums(数论)

    题目链接 Dreamoon loves summing up something for no reason. One day he obtains two integers a and b occa ...

  6. Codeforces Round #272 (Div. 2)-C. Dreamoon and Sums

    http://codeforces.com/contest/476/problem/C C. Dreamoon and Sums time limit per test 1.5 seconds mem ...

  7. Codeforces Round #272 (Div. 2)-B. Dreamoon and WiFi

    http://codeforces.com/contest/476/problem/B B. Dreamoon and WiFi time limit per test 1 second memory ...

  8. Codeforces Round #272 (Div. 2)-A. Dreamoon and Stairs

    http://codeforces.com/contest/476/problem/A A. Dreamoon and Stairs time limit per test 1 second memo ...

  9. Codeforces Round #272 (Div. 2)C. Dreamoon and Sums 数学推公式

    C. Dreamoon and Sums   Dreamoon loves summing up something for no reason. One day he obtains two int ...

随机推荐

  1. gulp之几个常用插件介绍

    今天给大家分享一篇gulp几款插件的使用 以下代码用到得模块加载‘ const gulp=require("gulp"); const gulpSass=require(" ...

  2. WebSocket 客户端实例

    Node.js var ws = require("ws"); var socket = new ws("ws://127.0.0.1:8001); var socket ...

  3. [译]C语言实现一个简易的Hash table(7)

    上一章我们讲了如何根据需要动态设置hash表的大小,在第四章中,我们使用了双重哈希来解决hash表的碰撞,其实解决方法有很多,这一章我们来介绍下其他方法. 本章将介绍两种解决hash表碰撞的方法: 拉 ...

  4. yii学习笔记(2),创建控制器

    将网站根目录配置到项目的web目录 打开网站访问的是web/index.php这时打开默认页面 访问一下其他页面,发现浏览器地址的url携带了一个参数 http://www.test.com/inde ...

  5. day 32 管道,信号量,进程池,线程的创建

    1.管道(了解) Pipe(): 在进程之间建立一条通道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象,强调一点:必须在产生Process对象之前产生管道. ...

  6. Rails中在model中获取当前登录用户

    应用场景:更新系统操作记录时,记录操作人即当前登录用户 方法一:在线程中添加一个变量 class UsersController < ApplicationController before_a ...

  7. golang 后台服务设计精要

    原文地址 守护进程 传统的后台服务一般作为守护进程(daemon)运行.linux 上创建 daemon 的步骤一般如下: 创建子进程,父进程退出: 调用系统调用 setsid() 脱离控制终端: 调 ...

  8. 20155321 实验四 Android程序设计

    20155321 实验四 Android程序设计 安装Android studio成功 任务一:Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)( ...

  9. 任务队列和异步接口的正确打开方式(.NET Core版本)

    任务队列和异步接口的正确打开方式 什么是异步接口? Asynchronous Operations Certain types of operations might require processi ...

  10. python爬虫:爬取慕课网视频

    前段时间安装了一个慕课网app,发现不用注册就可以在线看其中的视频,就有了想爬取其中的视频,用来在电脑上学习.决定花两天时间用学了一段时间的python做一做.(我的新书<Python爬虫开发与 ...