[NOIP2001]统计单词个数

点我写题

题目描述

给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份( 1 < k ≤ 40 ),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this中可包含this和is,选用this之后就不能包含th)。单词在给出的一个不超过6个单词的字典中。要求输出最大的个数。

题意个人补充:必须恰好分成k份(所以下面初始化成负无穷先),每份不能为空。

先处理出i-j区间的最多单词数(一开始我想用区间dp求,但是没考虑左端的合法字符串下标超过了区间右端j,导致转移不合法,然后只过了75%,敲响警钟!!),倒着转移,这样能保证每个开头只用了一次,然后再定义aij,仅考虑前i个字符划分成j份的最大单词数(缝合的板子题)

代码:

复制代码
import java.util.*;
import java.io.*;
public class Main {

	public static StringBuilder sk;
	public static String cs[];
	public static int s;
	public static boolean check(int x,int y) {
		String u=sk.substring(x,y+1);
		for(int i=1;i<=s;i++) {
			if(cs[i].length()>u.length()) continue;
			String tem=u.substring(0,cs[i].length());
			if(tem.equals(cs[i])) return true;
 		}
		return false;
	}
	public static void main(String[] args)throws Exception{
	      BufferedReader rd=new BufferedReader(new InputStreamReader(System.in));
	      BufferedWriter wd=new BufferedWriter(new OutputStreamWriter(System.out));
	      String dr[]=rd.readLine().split(" ");
	      int n=Integer.parseInt(dr[0]),k=Integer.parseInt(dr[1]);
	      sk=new StringBuilder(" ");
	      for(int i=1;i<=n;i++) sk.append(rd.readLine());
	      int len=n*20;
	      boolean fal[]=new boolean [len+10];
	      int dp[][]=new int [len+10][len+10];
	      s=Integer.parseInt(rd.readLine());
	      cs=new String [s+10];
	      for(int i=1;i<=s;i++) cs[i]=rd.readLine();
	      for(int i=len;i>=1;i--) {
	    	  for(int j=i;j>=1;j--) {
	    		  dp[j][i]=dp[j+1][i];
	    		  if(check(j,i)) dp[j][i]++;
	    	  }
	      }
	      int as[][]=new int [len+10][k+10];
	      for(int i=0;i<len+10;i++) {
	    	  Arrays.fill(as[i], -(int)1e9);
	      }
	      as[0][0]=0;
	      for(int i=1;i<=len;i++) {
	    	  for(int j=i;j>=1;j--) {
	    		  for(int p=1;p<=k;p++) {
	    			  as[i][p]=Math.max(as[i][p], as[j-1][p-1]+dp[j][i]);
	    		  }
	    	  }
	      }
	      System.out.print(as[len][k]+"\n");
	}

}
相关推荐
苏打豆1 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
蛋蛋的就会顺顺的1 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙1 小时前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头
zhangfeng11332 小时前
国产GPU/AI算力芯片现状(修订完整版 · 截至2026年9月
人工智能·算法·ai编程·npu
学代码的CJY2 小时前
从代码出发理解时间复杂度与空间复杂度
数据结构·算法
白帽攻防录3 小时前
SRC 挖洞:WSO2 JWT 算法混淆绕过深度复盘,CVE-2026-5430 不支持的算法怎么变成管理员
网络·算法·安全·网络安全·jwt
小O的算法实验室3 小时前
IEEE TEVC,基于精确与DQN群智能调度方法用于多目标异构USV
算法
可乐ea4 小时前
AI Agent 工具调用准确性评测:选择错误与参数错误分开测
大数据·人工智能·算法·大模型·工具调用·ai智能体·agent评测
上位机妹子4 小时前
C 语言 数组删除指定元素(快慢指针法)
c语言·数据结构·算法
心中有你02144 小时前
【路径规划】A*寻路算法最通俗易懂讲解(C语言完整实现+详细注释)
c语言·开发语言·算法