洛谷千题详解 | P1026 [NOIP2001 提高组] 统计单词个数【C++、Java语言】

news2025/1/17 6:06:13

博主主页:Yu·仙笙

专栏地址:洛谷千题详解

目录

题目描述

输入格式

输出格式

输入输出样例

解析:

C++源码:

Java源码:

C++源码2:


 

--------------------------------------------------------------------------------------------------------------------------------

题目描述

给出一个长度不超过 200由小写英文字母组成的字母串(该字串以每行 20 个字母的方式输入,且保证每行一定为 20 个)。要求将此字母串分成 k份,且每份中包含的单词个数加起来总数最大。

每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串 this 中可包含 this 和 is,选用 this 之后就不能包含 th

单词在给出的一个不超过 6 个单词的字典中。

要求输出最大的个数。

--------------------------------------------------------------------------------------------------------------------------------

输入格式

每组的第一行有两个正整数 p,k。 p 表示字串的行数,k 表示分为 k 个部分。

接下来的 p 行,每行均有 20个字符。

再接下来有一个正整数 s,表示字典中单词个数。 接下来的 s 行,每行均有一个单词。

--------------------------------------------------------------------------------------------------------------------------------

输出格式

1个整数,分别对应每组测试数据的相应结果。

--------------------------------------------------------------------------------------------------------------------------------

输入输出样例

输入 #1复制

1 3
thisisabookyouareaoh
4
is
a
ok
sab

输出 #1复制

7

--------------------------------------------------------------------------------------------------------------------------------

解析:

这题做了好久......两个动态规划,我谈谈我用C语言的做法。

①每读取一行可以用strcat把字符串连在一起

②从字符串A中搜索单词word可以用char *p=strstr(A,word);

返回NULL则找不到,顺带可以用p-A==0来判断单词是否从A[0]开始匹配。

③先预处理出w[i][j],表示从i到j的单词数。可以倒着推,w[i][j]=w[i+1][j];(如果存在从A[i]字母开始的单词,则w[i][j]=w[i+1][j]+1.出现同一字母开头的多个单词也还是加1就够了.)

④F[i][j]表示前i个字母分成j段得到的最大单词数,答案是F[len][k],可以初始化一下F[i][i]和F[i][1]. 方程F(i,j)=max{ F(r,j-1)+w(r+1,i) (r=j...i-1) }. 意思就是把1..r的字母先分成j-1段,剩下的r+1..i的字母分成另一段。

--------------------------------------------------------------------------------------------------------------------------------

C++源码:

#include<stdio.h>
#include<string.h>
int p,k,s,len,w[205][205],F[205][45];
char A[205],temp[25],word[10][205];
void Input(void)
{
    int i;
    scanf("%d%d",&p,&k); len=20*p;
    while(getchar()!='\n');
    while(p--)
    {
        gets(temp);
        strcat(&A[1],temp);
    }
    scanf("%d",&s);
    while(getchar()!='\n');
    for(i=1;i<=s;i++) gets(word[i]);
}
int have(int x,int end)//是否存在以字符A[x]开头的单词 
{
    int i; 
    for(i=1;i<=s;i++)
    {
        char *p=strstr(&A[x],word[i]);
        if(p!=NULL && p-&A[x]==0 
            && strlen(word[i])<=end-x+1) return 1;
    }
    return 0;
}
void Init(void)
{
    int i,j;
    for(j=len;j>=1;j--) 
        for(i=j;i>=1;i--)
            if(have(i,j)) w[i][j]=w[i+1][j]+1;
            else w[i][j]=w[i+1][j];
}
void DP(void)
{
    int i,j,r;
    for(i=1;i<=k;i++)   F[i][i]=F[i-1][i-1]+w[i][i];
    for(i=1;i<=len;i++) F[i][1]=w[1][i];
    for(i=1;i<=len;i++)
        for(j=2;j<=k&&j<i;j++)
            for(r=j;r<i;r++)
                if(F[i][j]<F[r][j-1]+w[r+1][i])
                    F[i][j]=F[r][j-1]+w[r+1][i];
}
int main(void)
{
    Input();
    Init();
    DP();
    printf("%d",F[len][k]);
    return 0;
}

--------------------------------------------------------------------------------------------------------------------------------

Java源码:

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Main {
	private static Scanner cin;
 
	public static void main(String args[]) throws Exception {
		cin = new Scanner(System.in);
		String word = cin.nextLine();
		String sentence = cin.nextLine();
		String wordExp = "[a-zA-Z]+";
		Pattern pattern = Pattern.compile(wordExp);
		Matcher matcher = pattern.matcher(sentence);
		int count = 0;
		int index = -1;
		while(matcher.find()) {
			if(matcher.group().equalsIgnoreCase(word)) {
				if (-1 == index) {
					index = matcher.start();
				}
				count++;
			}
		}
		if(count >0)
			System.out.println(String.format("%d %d", count,index));
		else
			System.out.println(index);
	}
}

 --------------------------------------------------------------------------------------------------------------------------------

C++源码2:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int p,n,m,k,dp[210][50],sum[210][210];
string s,a[10];
inline int read(){//读优。。。
	int date=0,w=1;char c=0;
	while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
	while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
	return date*w;
}
bool check(int l,int r){//判断是否有单词以s[l]为开头
    string x=s.substr(l,r-l+1);//取出字符串
    for(int i=1;i<=n;i++)if(x.find(a[i])==0)return true;//查找
    return false;
}
void init(){//预处理+读入
    string ch;
    s+='0';//让下标从1开始
    p=read();k=read();
    for(int i=1;i<=p;i++){
        cin>>ch;
        s+=ch;//string除了读入慢,其他啥都好。。。
    }
    n=read();m=s.length()-1;//记得减1。。。
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=m;i>=1;i--)
    for(int j=i;j>=1;j--){//预处理出sum[i][j]
        sum[j][i]=sum[j+1][i];
        if(check(j,i))sum[j][i]++;
    }
}
void work(){//开始dp
    dp[0][0]=0;
    for(int i=1;i<=k;i++)dp[i][i]=dp[i-1][i-1]+sum[i][i];
    for(int i=1;i<=m;i++)dp[i][1]=sum[1][i];//初始化
    for(int i=1;i<=m;i++)
    for(int j=1;j<=k&&j<i;j++)
    for(int l=j;l<i;l++)
    dp[i][j]=max(dp[i][j],dp[l][j-1]+sum[l+1][i]);//转移
    printf("%d\n",dp[m][k]);//输出
}
int main(){//主函数3行。。。
    init();
    work();
    return 0;
}

 --------------------------------------------------------------------------------------------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vector模板的简易实现

这篇文章&#xff0c;我们模拟一下STL里面的vector的实现。但是会简化一些内容&#xff0c;让大家能够更好的理解。模拟实现的目的不是为了更好的造轮子&#xff0c;而是为了更好的理解这些容器。 文章目录1. 成员变量2. push_back函数3. reserve函数4. pop_back函数和下标运算…

QT 多线程中使用QCanBusDevice进行PCAN通讯时,无法正常发出数据

QT 多线程中使用QCanBusDevice进行PCAN通讯时&#xff0c;无法正常发出数据 前言 我一开始的代码逻辑是&#xff0c;PCAN开启、关闭、发送、接收这些功能整合在一个工具类中&#xff0c;这个工具类的对象是在主线程创建的&#xff0c;然后我有一个要循环定时发送的功能是独立…

与企企通强强联手!哈尔斯二期数字化采购项目正式启动

近日&#xff0c;浙江哈尔斯真空器皿股份有限公司&#xff08;以下简称“哈尔斯”&#xff09;联合企企通举办二期数字化采购项目启动会&#xff0c;旨在助力哈尔斯实现采购数字化全面升级&#xff0c;提升自主品牌竞争力。会上&#xff0c;双方就该项目的建设方案、项目资源、…

铝合金表面处理废水除铝工艺

铝型材表面处理用水量大&#xff0c;产生废水多&#xff0c;废水中有害物质持续排放。如不加以处理必将污染环境。同时伴随着我国对排污量的征税&#xff0c;也会增加企业的成本和负担。因此&#xff0c;从企业的社会责任和效益两方面考虑&#xff0c;进行废水处理是必须和必要…

解决VsCode启动Vue项目报错:‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

问题描述 最近居家办公&#xff0c;网速不太稳定&#xff0c;开会的时候网络也是断断续续的&#xff0c;今天需要拉下前端项目运行起来 在我执行npm i下载包的时候&#xff0c;我看到网络超时的错误警告就感觉不太秒。知道大概率要启动失败了 果不其然执行npm run serve的时…

窃取信息的新恶意软件通过假冒的破解网站感染使用者

©网络研究院 一种名为“RisePro”的新型信息窃取恶意软件正在通过由 PrivateLoader 按安装付费 (PPI) 恶意软件分发服务运营的虚假破解站点进行分发。 RisePro 旨在帮助攻击者从受感染的设备中窃取受害者的信用卡、密码和加密钱包。 本周Flashpoint 和 Sekoia的分析师发…

前端框架 Nuxt3 集成 Pinia

目录 一、Nuxt3集成Pinia 二、Pinia的使用 state的使用 1、基本使用及动态渲染 2、state的重置 3、批量更改state数据 getters的使用 1、getters的基本使用 2、getters传参 actions的使用 1、actions的基本使用 一、Nuxt3集成Pinia 参考官方文档&#xff1a;简介 |…

【JavaSE】常用类(447~515)

String 447.常用类-每天一考 1.画图说明线程的生命周期&#xff0c;以及各状态切换使用到的方法等 状态&#xff0c;方法 2.同步代码块中涉及到同步监视器和共享数据&#xff0c;谈谈你对同步监视器和共享数据的理解&#xff0c;以及注意点。 synchronized(同步监视器){//操…

消息队列RabbitMQ学习笔记(五)高级特性

1. 发布确认高级 在生产环境中由于一些不明原因&#xff0c;导致 RabbitMQ 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c; 导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0c;我们开始思考&#xff0c;如何才能进行 RabbitMQ 的消息可靠投…

ccc-sklearn-11-线性回归(1)

1.线性回归概述 回归需求在现实中非常多&#xff0c;自然也有了各种回归算法。最著名的就是线性回归和逻辑回归&#xff0c;衍生出了岭回归、Lasso、弹性网&#xff0c;以及分类算法改进后的回归&#xff0c;如回归树、随机森林回归、支持向量回归等&#xff0c;一切基于特征预…

自定义卷积实现卷积的重参数【手撕代码】

在我的上篇文章中主要对RepVGG进行了解析【RepVGG网络中重参化网络结构解读】&#xff0c;里面详细的对论文中的代码进行了解析&#xff0c;展示了RepVGG在重参数时是如何将训练分支进行合并的&#xff0c;总的一句话就是在推理阶段&#xff0c;会将1x1以及identity分支以paddi…

vivo 游戏中心低代码平台的提效秘诀

作者&#xff1a;vivo 互联网服务器团队- Chen Wenyang 本文根据陈文洋老师在“2022 vivo开发者大会"现场演讲内容整理而成。公众号回复【2022 VDC】获取互联网技术分会场议题相关资料。 在互联网流量见顶和用户需求分层的背景下&#xff0c;如何快速迭代产品功能&#xf…

函数模板-C11/17/14

函数模板 文章目录函数模板定义函数模板使用函数模板样例两阶段翻译 Two-Phase Translation模板的编译和链接问题多模板参数引入额外模板参数作为返回值类型让编译器自己找出返回值类型将返回值声明为两个模板参数的公共类型样例默认模板参数样例重载函数模板模板函数特化非类型…

cocoapods的使用

swift开发之cocoapods的使用 之前介绍了cocoapods的使用&#xff0c;我们可以知道通过pod search XXX(三方依赖库名称)可以就搜索到想要的第三方是否存在。 这次主要简单介绍cocoapods如何引入第三方库的,以BluetoothKit为例。 首先&#xff0c;我们终端中通过cd命令定位到要…

二十二、shiro安全框架基础

一、简介 1. shiro简介 Apache Shiro 是 Java 的一个安全&#xff08;权限&#xff09;框架。Shiro 可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在JavaSE 环境&#xff0c;也可以用在 JavaEE 环境。Shiro 可以完成&#xff1a;认证、授权、加密、会话管理、与…

“智慧”控漏 削减产销差-城镇供水管网分区计量管理系统

平升电子城镇供水管网分区计量管理系统根据国际国内分区计量的要求和标准研发&#xff0c;专门针对水司漏损控制和产销差管理而设计。系统涵盖分区管理、管网流量和压力监控、水量统计分析、产销差分析、漏损评估、夜间最小流量分析、用水异常报警等功能。核心目标是找到整个管…

ReactJS入门

目录 一&#xff1a;前端开发的演变 二&#xff1a;ReactJS简介 三&#xff1a;搭建环境 四&#xff1a;React快速入门 一&#xff1a;前端开发的演变 到目前为止&#xff0c;前端的开发经历了四个阶段&#xff0c;目前处于第四个阶段。这四个阶段分别是&#xff1a; 阶段一…

equals()与hashcode()之间的关系

1、equals简介 被用来检测两个对象是否相等&#xff0c;即两个对象的内容是否相等&#xff1b; equals 方法&#xff08;是String类从它的超类Object中继承的&#xff09;用于比较引用和比较基本数据类型时具有不同的功能&#xff1a; 比较基本数据类型&#xff0c;如果两个值…

马哥SRE第11周课程作业

ansible role zabbix相关话题1. ansible 常用指令总结&#xff0c;并附有相关示例。1.1 Ansible相关工具1.1.1 ansible-doc1.1.2 ansible 命令用法1.1.3 ansible-console1.1.4 ansible-playbook1.1.5 ansible-vault1.1.5 ansible-galaxy2. 总结ansible playbook目录结构及文件用…

javaee之Spring4

之前说到AccountDao需要继承JdbcDaoSupport这个类&#xff0c;那么现在来看一下这个类的内容 JdbcDaoSupport.java package com.itheima.dao.impl;/*** 此类用于抽取dao中的重复代码 */public class JdbcDaoSupport {private JdbcTemplate jdbcTemplate;public void setJdbcT…