PKU 3267 The Cow Lexicon(动态规划)
题目大意:给定一个字符串和一本字典,问至少需要删除多少个字符才能匹配到字典中的单词序列。PS:是单词序列,而不是一个单词
思路: 动态规划
主要是知道状态方程的含义:
令dp[i]表示从message中第i个字符开始,到第L个字符(结尾处)这段区间所删除的字符数,初始化为dp[L]=0 (dp[i]的下标从0开始)
从message尾部向头部检索匹配,所以是下面的状态方程:
从程序可以看出,第i个位置到L所删除的字符数,总是先取最坏情况,只有mesg[i]可以匹配dict中单词首字母时才进入第二条方程进行状态优化更新。
第一条方程不难理解,只要弄懂dp[i]的意义就能简单推导
第二条方程难点在dp[pm]+(pm-i)-len
设pm是指向message的指针(其中i表示当前所匹配的单词在message中的起始位置),pd是指向字典的指针
匹配的过程是:
当确认message第i位和某单词的首位吻合时,就开始逐字匹配,字符相同则两个指针同时向后移动一次,否则pd固定,pm移动。
当因为pm>L跳出匹配时,说明匹配失败,dp[i]状态不变;当pd==单词长度时,单词匹配成功,进行dp[i]的状态更新优化
显然,匹配成功时,pm-i代表匹配过程中从位置i到pm的区间长度,再减去单词长度len,则得到从i到pm所删除的字符数(pm-i)-len。
又dp[pm]表示从pm到L所删除的字符数从而dp[pm]+(pm-i)-len表示i到L删除的字符数,不难证明这个值一定比dp[i]相等或更优,
因此取min赋值给dp[i],这是本题最难的地方,最后输出dp[0]就可以了。
注意:不能写dp[pm+1]+(pm-i+1)-len表示i到L删除的字符数。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int w,l;
while(cin>>w>>l){
int *dp=new int[l];
char *mesg=new char[l];
cin>>mesg;
string *dict=new string[w];
for(int i=;i<w;i++)
cin>>dict[i];
dp[l]=;
for(int i=l-;i>=;i--){
dp[i]=dp[i+]+;
for(int j=;j<w;j++){
int len=dict[j].length();
if(len<=l-i&&dict[j][]==mesg[i]){
int pm=i,pd=;
while(pm<l){
if(dict[j][pd]==mesg[pm++])
pd++;//不管dict[j][pd]和mesg[pm]是否相等,pm都要++
if(pd==len){
dp[i]=min(dp[i],dp[pm]+pm-i-pd);
break;//直接break,因为dp[i]表示的是待删除得最少字符,后面的就不用考虑了
}
}
}
}
}
cout<<dp[]<<endl;
}
}
PKU 3267 The Cow Lexicon(动态规划)的更多相关文章
- poj 3267 The Cow Lexicon (动态规划)
The Cow Lexicon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8167 Accepted: 3845 D ...
- POJ3267——The Cow Lexicon(动态规划)
The Cow Lexicon DescriptionFew know that the cows have their own dictionary with W (1 ≤ W ≤ 600) wor ...
- POJ 3267 The Cow Lexicon
又见面了,还是原来的配方,还是熟悉的DP....直接秒了... The Cow Lexicon Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- POJ - 3267 The Cow Lexicon(动态规划)
https://vjudge.net/problem/POJ-3267 题意 给一个长度为L的字符串,以及有W个单词的词典.问最少需要从主串中删除几个字母,使其可以由词典的单词组成. 分析 状态设置很 ...
- poj 3267 The Cow Lexicon(dp)
题目:http://poj.org/problem?id=3267 题意:给定一个字符串,又给n个单词,求最少删除字符串里几个字母,能匹配到n个单词里 #include <iostream> ...
- POJ 3267 The Cow Lexicon 简单DP
题目链接: http://poj.org/problem?id=3267 从后往前遍历,dp[i]表示第i个字符到最后一个字符删除的字符个数. 状态转移方程为: dp[i] = dp[i+1] + 1 ...
- POJ 3267:The Cow Lexicon(DP)
http://poj.org/problem?id=3267 The Cow Lexicon Time Limit: 2000MS Memory Limit: 65536K Total Submi ...
- POJ 3267:The Cow Lexicon 字符串匹配dp
The Cow Lexicon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8905 Accepted: 4228 D ...
- HDOJ-三部曲-1015-The Cow Lexicon
The Cow Lexicon Time Limit : 4000/2000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) To ...
随机推荐
- 最新Android面试题集锦
近期由于某些原因想换工作,整理一下个人认为面试中还比較值得记录的一些题目,给须要找这方面工作的人一个借鉴. 下面基本仅仅记录题目或者大概答案,假设大家有比較具体的解答或者比較好的面试题木,希望各位看到 ...
- Request获取具有相同 name 属性表单元素值
html代码如: <input name="txtName" id="txtFirstName" type="text" /> ...
- Window发声函数Beep、MessageBeep
C++ Code 1234567891011 WINBASEAPI BOOL WINAPI Beep(__in DWORD dwFreq, __in DWORD dwDuration ...
- hdu 3085(双向bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3085 思路:双向广搜,每次从M出发,搜三步,从G出发,搜一步,然后就是判断是否走到对方已经走过的格子, ...
- JQuery------图片幻灯片插件
下载地址: http://www.jq22.com/jquery-info36
- EF简单查询
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 第十三篇:K-Means 聚类算法原理分析与代码实现
前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...
- SG函数入门
sg[i]为0表示i节点先手必败. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数.例如mex{0,1,2,4}=3.mex{2 ...
- ios开发-获取手机相关信息
今天在做客户端的时候,里面有个意见反馈功能. 调用系统带的邮件功能,发送邮件到指定邮箱. 然后我就想,应该在邮件正文部分添加手机相关内容,比如型号,版本,应用程序的版本等等,这样不仅使用者方便,开发者 ...
- CH5301 石子合并【区间dp】
5301 石子合并 0x50「动态规划」例题 描述 设有N堆沙子排成一排,其编号为1,2,3,…,N(N<=300).每堆沙子有一定的数量,可以用一个整数来描述,现在要将这N堆沙子合并成为一堆, ...