从今天开始POJ里的一部分类型的题目就一般不放在一起写了

一个是太丑,格式麻烦,第二个是以后的题目难度都有所增大,因此一道题可能就要写蛮长

尤其是DP这一块,以前一直没好好学习,现在从基础的先开始吧

题意:给你一个较长的长度为L的串,以及W个长度较短的串。现在问你要从较长串中删去最少几个字符,才能使得这个串由那些长度较短的串组成。

好,题意有点难懂是吧,可以看一下example

删去那两个d使原串变成browncow,既满足要求

首先这个问题肯定满足从局部最优可以推到全局最优

即设f[i]表示先i个字符中最少要删去多少个字符才满足要求

然后发现f[i]可以从它前面转移:

f[i]=min(f[i-1]+1,f[j]+work(s(j,i),t[k]))(1<=i<=l;0<=j<i;1<=k<=w)

其中work表示要对s(j,i)删去几个字符才能使s(j,i)等于t[k]

CODE

#include<iostream>
#include<string>
using namespace std;
const int INF=1e9;
int n,m,cnt,f[305];
string s,t[605];
inline int get(string t,string s)
{
register int i;
int p=0;
for (i=0;i<t.size();++i)
if (s.find(t[i],p)!=string::npos) p=s.find(t[i],p)+1; else return INF;
return s.size()-t.size();
}
inline int work(string s)
{
int tot=INF;
for (register int i=1;i<=n;++i)
tot=min(tot,get(t[i],s));
return tot;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
std::ios::sync_with_stdio(false);
register int i,j;
cin>>n>>m>>s;
for (i=1;i<=n;++i)
cin>>t[i];
for (i=1,f[1]=1;i<=m;++i,f[i]=f[i-1]+1)
for (j=0;j<i;++j)
{
string temp=s.substr(j,i-j);
f[i]=min(f[i],f[j]+work(temp));
}
printf("%d",f[m]);
return 0;
}

但是这样的话时间复杂度爆炸

然后我们很显然地发现,对于一个串,只需要找到在前面第一个包含它的字串然后转移即可,就可以省去枚举j的那一维

CODE

#include<iostream>
#include<string>
using namespace std;
const int INF=1e9;
int n,m,cnt,f[305];
string s,t[605];
inline int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
std::ios::sync_with_stdio(false);
register int i,j;
cin>>n>>m>>s;
for (i=1;i<=n;++i)
cin>>t[i];
for (i=1,f[1]=1;i<=m;++i,f[i]=f[i-1]+1)
{
for (j=1;j<=n;++j)
{
int p1=i-1,p2=t[j].size()-1;
while (p2>=0&&p1>=0)
{
if (s[p1]==t[j][p2]) --p2; --p1;
}
if (p2<0) f[i]=min(f[i],f[p1+1]+i-p1-t[j].size()-1);
}
}
printf("%d",f[m]);
return 0;
}

POJ3267的更多相关文章

  1. POJ3267——The Cow Lexicon(动态规划)

    The Cow Lexicon DescriptionFew know that the cows have their own dictionary with W (1 ≤ W ≤ 600) wor ...

  2. poj3186 poj3267

    两道很不错的dp 3186很神似回文词,合并石子之类的问题: 一开始不知道怎么在dp方程中体现权值天数,很来才想起来 对于一段区间[i,j],里面的东西必然是要卖完的 又因为只能从两头开始卖,所以 d ...

  3. POJ-3267 The Cow Lexicon---删除字符匹配单词

    题目链接: https://cn.vjudge.net/problem/POJ-3267 题目大意: 题意就是给出一个主串,和一本字典,问最少在主串删除多少字母,可以使其匹配到字典的单词序列. PS: ...

  4. POJ3267 The Cow Lexicon(DP+删词)

    The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9041   Accepted: 4293 D ...

  5. POJ3267 The Cow Lexicon(dp)

    题目链接. 分析: dp[i]表示母串从第i位起始的后缀所对应的最少去掉字母数. dp[i] = min(dp[i+res]+res-strlen(pa[j])); 其中res 为从第 i 位开始匹配 ...

  6. 【个人训练】The Cow Lexicon(POJ-3267)

    继续大战dp.2018年11月30日修订,更新一下现在看到这个题目的理解(ps:就现在,poj又503了). 题意分析 这条题目的大意是这样的,问一字符串内最少删去多少的字符使其由给定的若干字符串构成 ...

  7. poj题目

    poj2965 poj1753:标准的BFS+位运算优化 poj1328:线段覆盖变种,把圆对应到线段上,贪心求解 poj2109:高精度开根,二分+高精度,注意要判断答案的位数,如果按照题目给的范围 ...

  8. poj分类 很好很有层次感。

    初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      ( ...

  9. 【转】POJ题目分类推荐 (很好很有层次感)

    OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期: 一. ...

随机推荐

  1. 微信小程序开发--宽为百分百,页面仍可左右滑动

    这段时间小程序开发时,很多时候,希望内容充满整个屏幕(高度.宽度100%),如下图 但是在设置 .followrecords-container{width:100%;} 后发现 手机在横向上虽然页面 ...

  2. Windows10系统的Linux子系统中安装MySQL数据库心得

    后端开发童鞋们, 自己开发机用的是Windows系统电脑(台式机或笔记本), 而开发的程序和使用的数据库等要运行在Linux服务器上, 这种情况有木有? 提前声明: 本文并不讨论操作系统的比较, 以及 ...

  3. webpack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  4. C#多线程的用法8-线程间的协作AutoResetEvent

    AutoResetEvent自动重置事件,与ManualResetEvent是相对的而言.它同样用于线程间同步,请对照<C#多线程的用法7-线程间的协作ManualResetEvent>进 ...

  5. CAC的Debian-8-64bit安装BBR正确方式是?

    裝过三台debian 64 bit, CAC, 2歐, KVM虛擬機 做法都一樣 0. 有裝銳速記得先刪除, 免得換核心後, 銳速在扯後腿 1.換4.9版kernel 有正式版 別裝啥rc版, 4.9 ...

  6. css继承属性与非继承属性

    一.无继承性的属性 1.display:规定元素应该生成的框的类型 2.文本属性: vertical-align:垂直文本对齐 text-decoration:规定添加到文本的装饰 text-shad ...

  7. crontab 命令使用

    什么是crontab? crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. ...

  8. SecureCRT Win免安装版本,简单好用

    SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件. 这个简单好用,程序员必备. 下载地址:SecureCRT. ...

  9. Python接口自动化--post提交的四种数据类型 4

    常见的post请求提交的数据类型有四种: 1.第一种:application/json:这是最常见的json格式,如下 {"input1":"XXX",&quo ...

  10. 2017-2018-2 20165318 实验三《Java面向对象程序设计》实验报告

    2017-2018-2 20165318 实验三<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计        班级:1653班        姓名:孙晓暄  ...