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 ...
随机推荐
- 还是PHPExcel问题
//设置自动设置宽度,但是对中文不起作用..(中文自动长还在研究当中) $objPHPExcel->getActiveSheet()->getColumnDimension('A')-&g ...
- hdu 1756:Cupid's Arrow(计算几何,判断点在多边形内)
Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- asp.net 动态添加多个用户控件
动态添加多个相同用户控件,并使每个用户控件获取不同的内容. 用户控件代码: 代码WebControls using System; using System.Collections.Generic; ...
- C++之强制类型转换
C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...
- Appium移动自动化测试(一)--工具软件安装
Appium移动自动化测试(一)--工具软件安装 详情参考-- http://www.cnblogs.com/fnng/p/4552438.html 第一节 安装node.js Appium 官方网 ...
- 编程之美 set 13 光影切割问题
题目 给出几条线段, 求解这几条线段把给定平面切成的份数 思路 1. 枚举 3 条直线的情况, 发现有规律可循 两条直线, 一个交点 -> 空间分成 4 份 三条直线, 两个交点 -> 空 ...
- laravel 配置修改及读取
1)laravel 的所以配置文件都在根目录下的 config 目录里,直接看一个配置文件的名字就知道是做什么的了,这里不说了 2)读取配置的方法 $value = config('app.timez ...
- iOS UIWebView 获取内容实际高度,关闭滚动效果
本文转载至 http://my.oschina.net/Khiyuan/blog/341535 iOS UIWebView 获取内容实际高度,关闭滚动效果 近期做东西,将 UIWebView 嵌套 ...
- Myeclipse下使用Maven搭建spring boot项目(第二篇)
现在需要搭建spring boot框架,并实现一个HelloWorld的项目,让程序真正运行起来. 一.在pom.xml中引入spring-boot-start-parent,spring官方的叫st ...
- LeetCode-Combination Sum IV
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...