BZOJ 1633 [Usaco2007 Feb]The Cow Lexicon 牛的词典:dp【删字符最少】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1633
题意:
给你一个长度为n的主串a,和一个有m个字符串s[i]的单词书(s[i].size <= 25)。
问你至少删去多少个a中的字符,才能使a成为一个由s[i]组成的排列。
题解:
从后往前推。
表示状态:
dp[i] = min eliminations
表示第i个及以后的字符合法时,删去字符的最小数量。
找出答案:
ans = dp[0]
整个串合法。
如何转移:
对于第i个字符,要么删去(情况1),要么不删(情况2)。
(1)dp[i] = min dp[i+1] + 1
(2)dp[i] = min dp[i+t+len] + t
枚举s[i],长度为len。若i为s[i]的首字母,则至少要删去t个字符。
s[i]尾字母的下一位 = i+t+len。
所以dp[i]由dp[i+t+len]转移而来。
暴力求t就好,单次复杂度O(n)。程序总复杂度为O(n^2 * m)。
边界条件:
dp[n] = 0
AC Code:
// state expression:
// dp[i] = min eliminations
// i: considering ith letter
//
// find the answer:
// ans = dp[0]
//
// transferring:
// dp[i] = min dp[i+t+len] + t
// dp[i] = min dp[i+1] + 1
//
// boundary:
// dp[n] = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 305
#define MAX_M 605 using namespace std; int n,m;
int dp[MAX_N];
string a;
string s[MAX_M]; void read()
{
cin>>m>>n>>a;
for(int i=;i<m;i++)
{
cin>>s[i];
}
} int cal_elim(int x,int y)
{
int cnt=;
int pos=;
for(int i=x;i<n;i++)
{
if(a[i]==s[y][pos]) pos++;
else cnt++;
if(pos==s[y].size()) return cnt;
}
return -;
} void solve()
{
dp[n]=;
for(int i=n-;i>=;i--)
{
dp[i]=dp[i+]+;
for(int j=;j<m;j++)
{
int t=cal_elim(i,j);
if(t!=-) dp[i]=min(dp[i],dp[i+t+s[j].size()]+t);
}
}
} void print()
{
cout<<dp[]<<endl;
} int main()
{
read();
solve();
print();
}
BZOJ 1633 [Usaco2007 Feb]The Cow Lexicon 牛的词典:dp【删字符最少】的更多相关文章
- BZOJ 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典
题目 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 401 Solv ...
- BZOJ 1633 [Usaco2007 Feb]The Cow Lexicon 牛的词典(单调DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1633 [题目大意] 给出一个字符串和一个字符串集, 问要删去多少个字符该字符串才可以被 ...
- bzoj 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典【dp】
预处理出g[i][j]表示原串第i个匹配第j个单词需要去掉几个字母(匹配不上为-1) 设f[i]为i及之后满足条件要去掉的最少字母 倒着dp! f[i]初始为f[i+1]+1,转移方程为f[i]=mi ...
- 【BZOJ】1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1633 一开始也想到了状态f[i]表示i以后的字符串最少删的数 然后想到的转移是 f[i]=min{f ...
- bzoj1633 [Usaco2007 Feb]The Cow Lexicon 牛的词典
Description 没有几个人知道,奶牛有她们自己的字典,里面的有W (1 ≤ W ≤ 600)个词,每个词的长度不超过25,且由小写字母组成.她们在交流时,由于各种原因,用词总是不那么准确.比如 ...
- 【动态规划】bzoj1633 [Usaco2007 Feb]The Cow Lexicon 牛的词典
f[i]=min{f[i+1]+1,f[i+len[j]+cant]+cant}(for i=L-1 downto 0)(1<=j<=w) #include<cstdio> # ...
- BZOJ 1631: [Usaco2007 Feb]Cow Party( 最短路 )
这道题和蔡大神出的今年STOI初中组的第二题几乎一模一样... 先跑一遍最短路 , 再把所有边反向 , 再跑一遍 , 所有点两次相加的最大值即为answer --------------------- ...
- BZOJ 1631: [Usaco2007 Feb]Cow Party
题目 1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 491 Solved: 362[Sub ...
- BZOJ 1635: [Usaco2007 Jan]Tallest Cow 最高的牛
题目 1635: [Usaco2007 Jan]Tallest Cow 最高的牛 Time Limit: 5 Sec Memory Limit: 64 MB Description FJ's N ( ...
随机推荐
- 访问权限修饰符Protected专题
上图描述:A类在a包下,m()方法被protected修饰 上图描述:B类也在a包下,B类是A类的子类. 解析:B类和A类是同包类,B类是A类的子类,因此b对象可以调用m()方法. 上图描述:C类也在 ...
- SSL/TLS协议
今天闲着给自己的网站申请了一个免费证书,顺便复习下SSL/TLS协议 (https 就是在http+ssl协议) SSL介绍: 安全套接字(Secure Socket Layer,SSL)协议是 ...
- Samp免流软件以及地铁跑酷的自校验分析
[文章标题]:Samp免流软件以及地铁跑酷的自校验分析 [文章作者]: Ericky [作者博客]: http://blog.csdn.net/hk9259 [下载地址]: 自行百度 [保护方式]: ...
- vue 给组件绑定原生事件
有时候,你可能想在某个组件的根元素上监听一个原生事件.可以使用 v-on 的修饰符 .native.例如: <my-component v-on:click.native="doThe ...
- ffplay 播放m3u8 hls Failed to open segment of playlist 0
用ffplay 播放m3u8文件 出现 Failed to open segment of playlist 0,Error when loading first segment 'test0.ts' ...
- 搭建spark中需要注意的问题
在搭建spark的过程中遇到了许多的问题,但是引起这些问题的原因都是因为环境变量没有设置好导致的,这里总结的一些优秀的博文,可以供以后参考 http://www.powerxing.com/insta ...
- 修改mysql数据库 密码
将密码改成123456 update mysql.user set authentication_string=password('123456') where user='root' and Hos ...
- 排序&匿名函数
nums=[11,34234,23,344,123,1,23,124,523,4,12342341,423,43545] nums.sort() print(nums) #这个就是排序,从小到到 匿名 ...
- [概率dp] hdu 5378 Leader in Tree Land
题意: 给你一颗以1位根节点的树.我们定义对于每一个子树,节点权值最大的权值记为这个子树的权值,为你将1~n放到这个树里 满足最大权值仅仅有k个的组合数是多少. 思路: 我们能够知道以每一个节点为子树 ...
- 关于 angular cookie 设置的坑
初识Angular,才知道掉进了这么一个各种大坑的坑. 先说下对于$cookie.put 这几个方法,只有1.4以上版本才可以用,其余低于版本请使用 $cookieStore: 下面举例下使用方法: ...