博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3267 The Cow Lexicon(dp)
阅读量:4570 次
发布时间:2019-06-08

本文共 2158 字,大约阅读时间需要 7 分钟。

状态转移算是比较好推把,但是匹配字符串很容易会超时,跟以前某个题目的用法很类似,从第i个字母往后找假如到第j个字母匹配了一个单词,这样dp[j] = dp[i-1]+j-i-l[k]+1,取小即可。

1 #include 
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 int dp[501]; 8 char str[601][31],s1[601],l[601]; 9 int num,n,len;10 int main()11 {12 int i,j,k,u;13 scanf("%d%d",&n,&len);14 scanf("%s",s1);15 for(i = 1; i <= n; i ++)16 {17 scanf("%s",str[i]);18 l[i] = strlen(str[i]);19 }20 for(i = 0; i <= len-1; i ++)21 {22 dp[i] = i+1;23 }24 for(i = 0; i <= len-1; i ++)25 {26 for(j = 1; j <= n; j ++)27 {28 if(s1[i] == str[j][0])29 {30 num = 1;31 if(l[j] == 1)32 {33 dp[i] = min(dp[i],dp[i-1]);34 for(u = i+1;u <= len-1;u ++)35 {36 if(i-1 >= 0)37 dp[u] = min(dp[u],dp[i-1]+u-i-l[j]+1);38 else39 dp[u] = min(dp[u],u-i-l[j]+1);40 }41 }42 else43 {44 for(k = i+1; k <= len-1; k ++)45 {46 if(str[j][num] == s1[k])47 {48 num ++;49 }50 if(num == l[j])51 {52 for(u = k;u <= len-1;u ++)53 {54 if(i-1 >= 0)55 dp[u] = min(dp[u],dp[i-1]+u-i-l[j]+1);56 else57 dp[u] = min(dp[u],u-i-l[j]+1);58 }59 break;60 }61 }62 }63 }64 }65 }66 printf("%d\n",dp[len-1]);67 return 0;68 }

 

转载于:https://www.cnblogs.com/naix-x/archive/2012/12/04/2802031.html

你可能感兴趣的文章
java方法重载例题_Java方法重载实现原理及代码实例
查看>>
java 字符串 包含 次数_用JAVA写查询一个字符串中是否包含另外一个字符串以及出现的次数...
查看>>
java jvm arg_java – Ant,jvmarg,系统属性和引号
查看>>
karp算法Java_Java – 具有Held和Karp算法的旅行推销员
查看>>
Session共享问题---理论
查看>>
Redis键的基本操作
查看>>
redis的安装---Linux
查看>>
Redis过期命令
查看>>
Redis键的序列化和反序列化
查看>>
启动程序添加启动脚本
查看>>
CF1194E Count The Rectangles
查看>>
Gym100212C Order-Preserving Codes
查看>>
ARC076F Exhausted
查看>>
TC1570 DesertWind
查看>>
CF277D Google Code Jam
查看>>
(七)unittest单元测试框架
查看>>
(八) 自动化测试的实例(以浏览器为例)
查看>>
js获取单选框和复选框的值并判断值存在后允许转跳
查看>>
任务一:零基础HTML编码
查看>>
C#类和结构以及堆和栈大烩菜(本来就迷,那就让暴风来的更猛烈吧!)
查看>>