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 ( ...
随机推荐
- java并发之hashmap
在Java开发中经常会使用到hashmap,对于hashmap又了解多少,经常听到的一句话是hashmap是线程不安全的,那为什么是线程不安全的,如何才能保证线程安全,JDK又给我们提供了那些线程安全 ...
- BZOJ2527Meteors
BZOJ2527 整体二分模板题 整体二分: 主要用于解决第K大问题 #include<cstdio> #include<cctype> #include<vector& ...
- Android 实现Activity后台运行
有时需要让activity在后台运行,具体实现方法如下: 在AndroidManifest.xml中,activity属性中增加: android:theme="@style/Backgro ...
- 【spring cloud】Feign使用填坑
引用地址:https://blog.csdn.net/liuchuanhong1/article/details/54728681 问题一: 在前面的示例中,我们讲过 @RequestMapping( ...
- chm 转 pdf 工具推荐与对比
在进行推荐chm转pdf的软件之前,首先来了解一下为什么我们要将chm转为pdf. CHM是英语“Compiled Help Manual”的简写,即“已编译的帮助文件”.CHM是微软新一代的帮助文件 ...
- 使用 sftp 向linux服务器传输文件
sftp是加密的文件传输. 登陆 sftp name@123.21.331.1 1 2.把本地文件name1传到服务器name2下 put /name1.html /name2/ 1 把服务器name ...
- 手把手教你安装Hbase,一次成功!
安装环境: OS: Centos 6.5 JDK: jdk1.6.0_18 Hadoop: hadoop-0.20.2 Hbase: hbase-0.90.5 安装准备: 1. Jdk环境 ...
- C++ 继承与接口 知识点 小结(一)
[摘要] 要求理解覆盖.重载.隐藏的概念与相互之间的差别.熟记类继承中对象.函数的訪问控制:掌握虚函数.虚函数表.虚函数指针的联系:理解区分虚函数和虚继承在虚方法.虚指针在空间分配上的重点与难点:熟练 ...
- PHP网站http替换https
PHP网站http替换https
- [LeetCode][Java] Best Time to Buy and Sell Stock IV
题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...