【链接】 我是链接,点我呀:)

【题意】

题意

【题解】

设dp[i][j]表示前i个字符分成j个部分的最多匹配单词个数。
则dp[i][j] = dp[prei][j-1] + get_num(prei+1,i)
其中get_num(l,r)表示s[l..r]中有多少个子串能够和字典中的单词匹配。
这个get_num不能直接两重暴力搞。
需要得到mi[i](即s[i..mi[i]]能和字典中的某个单词匹配,且mi[i]最小)
然后就能一重循环枚举了,只需查看mi[i]是否小于等于r即可,如果满足,则说明以i开头的字符串中至少有一个能和字典中的单词匹配。
(一个就够了)

【代码】

  1. import java.io.IOException;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.HashSet;
  5. import java.util.LinkedList;
  6. import java.util.Scanner;
  7. import java.util.Set;
  8. import java.util.TreeSet;
  9. import java.util.Vector;
  10. public class Main {
  11. final static int Len = 200;
  12. final static int K = 40;
  13. static int p,k,n;
  14. static String s;
  15. static int dp[][];//dp[i][j]表示前i个字符,分成j个部分的话,最多能匹配多少个单词。
  16. static int mi[];//mi[i]表示s[i..mi[i]]能够和字典中的某个字符串匹配,且mi[i]是最小的
  17. static HashSet dic;
  18. //查找s[l..r]这个区间内有多少个字典中的字符串
  19. public static int get_num(int l,int r) {
  20. int ans = 0;
  21. for (int i = l;i <= r;i++)
  22. if (mi[i]<=r) {//最短的如果能匹配那么就ok,如果不行的话则说明以i开头没有字符串可以和字典匹配(至少在l..r这一段)
  23. ans++;
  24. }
  25. return ans;
  26. }
  27. public static void main(String[] args) throws IOException{
  28. // TODO Auto-generated method stub
  29. Scanner in = new Scanner(System.in);
  30. p = in.nextInt();k = in.nextInt();
  31. dp = new int[Len+10][K+10];
  32. dic = new HashSet();
  33. mi = new int[Len+10];
  34. StringBuilder sb = new StringBuilder();
  35. sb.append(" ");
  36. for (int i = 1;i <= p;i++) {
  37. String temp;
  38. temp = in.next();
  39. sb.append(temp);
  40. }
  41. s = sb.toString();
  42. n = s.length()-1;
  43. p = in.nextInt();
  44. for (int i = 1;i <= p;i++) {
  45. String temp;
  46. temp = in.next();
  47. dic.add(temp);//把输入的单词加入到集合当中去
  48. }
  49. //处理出来mi数组
  50. for (int i = 1;i <= n;i++) {
  51. sb = new StringBuilder();
  52. mi[i] = 10000000;
  53. for (int j = i;j <= n;j++) {
  54. sb.append(s.charAt(j));
  55. if (dic.contains(sb.toString())) {//如果s[i..j]能够匹配,则说明mi[i]=j,因为j是顺序增长的
  56. mi[i] = j;
  57. break;
  58. }
  59. }
  60. }
  61. for (int i = 1;i <= n;i++)
  62. for (int j = 0;j <= i-1;j++) {//枚举前一个状态的j
  63. int cost = get_num(j+1,i);//获取j+1..i这一段有多少个单词
  64. for (int l = 0;l <= Math.min(j, k);l++) {//枚举1..i这个字符串被分成了多少段
  65. dp[i][l+1] = Math.max(dp[i][l+1],dp[j][l]+cost);//尝试更新状态
  66. }
  67. }
  68. System.out.println(dp[n][k]);
  69. }
  70. }

【1657: [蓝桥杯][算法训练VIP]】统计单词个数的更多相关文章

  1. Java实现 蓝桥杯 算法训练VIP 报数(暴力+数学)约瑟夫环问题

    试题 算法训练 报数 问题描述 现有n个同学站成一圈,顺时针编号1至n.从1号同学开始顺时针1/2报数,报到1的同学留在原地,报到2的同学退出圆圈,直到只剩一名同学为止.问最后剩下的同学编号. 输入格 ...

  2. 问题 1936: [蓝桥杯][算法提高VIP]最大乘积

    问题 1936: [蓝桥杯][算法提高VIP]最大乘积 时间限制: 1Sec 内存限制: 128MB 提交: 77 解决: 16 题目描述 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? ...

  3. Java实现 蓝桥杯 算法训练 字串统计

    算法训练 字串统计 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最 ...

  4. Java 蓝桥杯 算法训练(VIP) 最大体积

    最大体积 问题描述 每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积. 假如每个物品有无限件可用,那么有些体积是永远也装不出来的. 为了尽量装满背包,附中的OIER想要研究一下 ...

  5. Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)

    试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...

  6. Java实现蓝桥杯 算法训练 大等于n的最小完全平方数

    试题 算法训练 大等于n的最小完全平方数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输出大等于n的最小的完全平方数. 若一个数能表示成某个自然数的平方的形式,则称这个数为完全平 ...

  7. 蓝桥杯算法训练 java算法 表达式求值

    问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...

  8. 蓝桥杯 算法训练 ALGO-57 删除多余括号

    算法训练 删除多余括号   时间限制:1.0s   内存限制:512.0MB 问题描述 从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置 ...

  9. Java实现 蓝桥杯 算法训练 出现次数最多的整数

    算法训练 出现次数最多的整数 时间限制:1.0s 内存限制:512.0MB 提交此题 问题描述 编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会 ...

随机推荐

  1. sql server数据库添加记录

    转自:http://jingyan.baidu.com/article/f25ef254449a9a482c1b8293.html

  2. java静态代理实例

    package test; class ProxyTest { public static void main(String[] args) { ProxyClass proxy = new Prox ...

  3. [Swift通天遁地]八、媒体与动画-(6)使用开源类库快速实现滑入动画

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. Canvas和SVG的基础知识,以及两者的区别(小白)

    首先我们来说一下Canvas是什么,它有什么作用以及它的知识点. Canvas是<HTML5>的新标签,它通常用于通过脚本(也就是JavaScript)来绘制图像.但是它本身并没有绘制能力 ...

  5. Java一维数组二维数组详解API

    所谓数组,是有序的元素序列. 若将有限个类型相同的变量的集合命名,那么这个名称为数组名.组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量.用于区分数组的各个元素的数字编号称为下标 ...

  6. 【洛谷1654/BZOJ4318】OSU!(期望DP)

    题目: 洛谷1654 分析: 本人数学菜得要命,这题看了一整天才看明白-- 先说说什么是"期望".不太严谨地说,若离散型随机变量(可以看作"事件")\(X\)取 ...

  7. springboot自定义常量配置

    现在你建一个类: import org.springframework.boot.context.properties.ConfigurationProperties; /** * Created b ...

  8. 【转】Centos7 ftp 配置及报错处理

    原文链接: https://www.cnblogs.com/GaZeon/p/5393853.html Centos7网络配置,vsftpd安装及530报错解决 今天在虚拟机安装CentOS7,准备全 ...

  9. body全屏css/网页全屏设置/全屏样式

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. JS——正则

    正则的声明: 1.构造函数:var 变量名= new RegExp(/表达式/); 2.直接量:var 变量名= /表达式/; test()方法: 1.正则对象方法,检测测试字符串是否符合该规则,返回 ...