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

【题意】

题意

【题解】

设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开头的字符串中至少有一个能和字典中的单词匹配。
(一个就够了)

【代码】

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import java.util.Vector; public class Main { final static int Len = 200;
final static int K = 40;
static int p,k,n;
static String s;
static int dp[][];//dp[i][j]表示前i个字符,分成j个部分的话,最多能匹配多少个单词。
static int mi[];//mi[i]表示s[i..mi[i]]能够和字典中的某个字符串匹配,且mi[i]是最小的
static HashSet dic; //查找s[l..r]这个区间内有多少个字典中的字符串
public static int get_num(int l,int r) {
int ans = 0;
for (int i = l;i <= r;i++)
if (mi[i]<=r) {//最短的如果能匹配那么就ok,如果不行的话则说明以i开头没有字符串可以和字典匹配(至少在l..r这一段)
ans++;
}
return ans;
} public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
p = in.nextInt();k = in.nextInt();
dp = new int[Len+10][K+10];
dic = new HashSet();
mi = new int[Len+10]; StringBuilder sb = new StringBuilder();
sb.append(" ");
for (int i = 1;i <= p;i++) {
String temp;
temp = in.next();
sb.append(temp);
} s = sb.toString();
n = s.length()-1; p = in.nextInt();
for (int i = 1;i <= p;i++) {
String temp;
temp = in.next();
dic.add(temp);//把输入的单词加入到集合当中去
} //处理出来mi数组
for (int i = 1;i <= n;i++) {
sb = new StringBuilder();
mi[i] = 10000000;
for (int j = i;j <= n;j++) {
sb.append(s.charAt(j));
if (dic.contains(sb.toString())) {//如果s[i..j]能够匹配,则说明mi[i]=j,因为j是顺序增长的
mi[i] = j;
break;
}
}
}
for (int i = 1;i <= n;i++)
for (int j = 0;j <= i-1;j++) {//枚举前一个状态的j
int cost = get_num(j+1,i);//获取j+1..i这一段有多少个单词
for (int l = 0;l <= Math.min(j, k);l++) {//枚举1..i这个字符串被分成了多少段
dp[i][l+1] = Math.max(dp[i][l+1],dp[j][l]+cost);//尝试更新状态
}
}
System.out.println(dp[n][k]);
} }

【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. bzoj3894: 文理分科(还是那道最小割)

    3894: 文理分科 题目:传送门 感谢波老师没有来D飞我,让我做出了这题... 题解: 这题其实和我做的上一题(bzoj2132)很像,所以就不写题意了. 依然是那最小割... 这题给出了四个利益矩 ...

  2. WebSocket 网页聊天室的实现(服务器端:.net + windows服务,前端:Html5)

    websocket是HTML5中的比较有特色一块,它使得以往在客户端软件中常用的socket在web程序中也能轻松的使用,较大的提高了效率.废话不多说,直接进入题. 网页聊天室包括2个部分,后端服务器 ...

  3. P3567 [POI2014]KUR-Couriers 主席树

    这个题比一般主席树还要简单,但是用来练习主席树再好不过了,在这里我再放一下主席树板子. 代码: #include<iostream> #include<cstdio> #inc ...

  4. 编译android4.4 报错error: call to '__property_get_too_small_error' declared with attribute 的处理 (转载)

    转自:http://blog.csdn.net/syhost/article/details/14448899 完整的报错为: system/core/include/cutils/propertie ...

  5. [App Store Connect帮助]二、 添加、编辑和删除用户(2)查看并编辑您的个人帐户

    您可以在 App Store Connect 的“编辑个人资料”中查看和编辑个人信息.如果您的 Apple ID 与多个帐户相关联,您可以在您的用户帐户之间切换. 查看您的个人帐户 在任意 App S ...

  6. day03_12/13/2016_bean属性的设置之setter方法注入

  7. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'empid' in 'class cn.happy.entity.Emp'

    org.apache.ibatis.exceptions.PersistenceException: ### Error querying database.  Cause: org.apache.i ...

  8. C语言常量

    Constant包括4种类型: 整型 浮点型 枚举 字符型 #include <stddef.h> #include <uchar.h> int main() { /* Int ...

  9. Android 在fragment中实现返回键单击提醒 双击退出

    尝试用mvp架构加dagger2来重写了一下,大致功能都实现了,还没有全部完成. 项目地址 接近完成的时候,想在天气信息页面实现一个很常见的功能,也就是点击屏幕下方的返回键的时候不是返回到上一个act ...

  10. 【GAN学习笔记】对抗式生成网络入门

    今天观看学习了一下台大李宏毅所讲授的 <Introduction of Generative Adversarial Network (GAN)>,对GAN有了一个初步的了解. GAN的基 ...