首页 > 其他分享 >abc344_D - String Bags 题解

abc344_D - String Bags 题解

时间:2024-03-09 23:23:32浏览次数:26  
标签:Bags String int 题解 abc344 sl 字符串

一个月没有碰 oi,感觉水平已经退化到负的了。来复健一下。


D - String Bags

link

题意:给你 \(n\) 组字符串组,按 \(1\) ~ \(n\) 的顺序,对于每组字符串组,可从中至多选一个字符串。求能否用所选串按顺序拼接成指定串,以及选取字符串的最小个数。

然后读完题发现是个 \(01\) 背包;对于第 \(i\) 组的串,考虑其中有无能拼接到选定的前 \(i-1\) 个串的某个末端,并且价值更优。

其他见代码注释解释。

#include<bits/stdc++.h>
using namespace std;
const int inf=1e9;
int m,n;
int f[110][110];
int tl,sl;
string t,s;
int main(){
	cin>>t;
	tl=t.size();
	for(int i=0;i<110;i++)
		for(int j=0;j<110;j++) f[i][j]=inf;
	f[0][0]=0;
	scanf("%d",&m);
	for(int i=0;i<m;i++){
		for(int j=0;j<110;j++) f[i+1][j]=f[i][j];//用前 i 个组的结果对 f[i+1][j] 进行更新
		scanf("%d",&n);
		while(n--){
			cin>>s;
			sl=s.size();
			for(int j=0;j+sl<=tl;j++){
				int ok=1;//这个循环判断,在这个位置接上该子串,能否构成目标串
				for(int k=0;k<sl;k++){
					if(s[k]!=t[j+k]){//匹配不上
						ok=0;
						break;
					}
				}
				if(ok) f[i+1][j+sl]=min(f[i+1][j+sl],f[i][j]+1);//01 背包的选择,更新;
			}
		}
	}
	if(f[m][tl]==inf) puts("-1");
	else printf("%d",f[m][tl]);
	return 0;
} 

另:出题人很好心的把正解写进了 title。

标签:Bags,String,int,题解,abc344,sl,字符串
From: https://www.cnblogs.com/Moyyer-suiy/p/18063583

相关文章

  • AT_abc344_e 题解
    本文同步发表于洛谷。赌狗天天输的一集。赛时各种【数据删除】原因导致没做出来。大意给你一个长度为\(N\)的序列\(A=(A_1,\ldots,A_N)\)。保证\(A\)中的元素是不同的。你要处理\(Q\)个操作。每个操作是以下两种类型之一:1xy:在\(A\)中元素\(x\)后面紧接着插入......
  • AT_abc344_d 题解
    赌狗天天输的一集。大意你最开始有一个空字符串\(S\)。你还有编号为\(1,2,\dots,N\)的袋子,每个袋子都包含一些字符串。袋子\(i\)包含\(A_i\)个字符串\(S_{i,1},S_{i,2},\dots,S_{i,A_i}\)。对\(i=1,2,\dots,N\)重复以下步骤仅一次(这里原题没有讲清楚):......
  • P10238 [yLCPC2024] F. PANDORA PARADOXXX 题解
    分析考虑时光倒流。对于需要合并的两个连通块\(x,y\),其合并之后的最远点对距离一定是合并之前的两组点对中产生的。在合并的时候枚举点对,取距离最大值即可。由于我们是倒着来的,所有连通块的最远点对距离最大值不减,所以能直接在合并之后取最大值。维护连通块用并查集即可。复杂......
  • P10237 [yLCPC2024] E. Latent Kindom 题解
    分析一眼了非最优解。考虑二分答案。对于二分出来的中位数\(x\),到\(a_i\)和\(a_j\)里边又去二分。得到两个序列中不超过\(x\)的数的数量。若这个数量\(cnt\ge\lceil\frac{len_{i}+len_{j}}{2}\rceil\),则\(x\)可能成为中位数,然后继续二分即可。把序列离散化,复杂度......
  • [ABC219F] Cleaning Robot 题解
    [ABC219F]CleaningRobot题解思路解析要点:将整个图拆分成每一轮的每一个点单独考虑贡献。首先看到\(k\le10^{12}\)发现不能直接枚举\(k\)轮,于是开始找每一轮的规律。首先可以知道,如果操作固定,那么起点和路径上每一个点以及终点的相对位置不会改变。也就是说每一轮的起......
  • CF1583E Moment of Bloom 题解
    题意:给定一张\(n\)个点\(m\)条边无向连通图,以及\(q\)个点对\((a,b)\),出事每条边权值为\(0\)。对于每个点对我们需要找一条从一个点到另一个点的简单路径,将所有边的权值加一。要求构造一种方案使得每条边权值都是偶数。如果不行,输出最少还要几个点对才能满足要求。\(n,m......
  • CF1634E Fair Share 题解
    题意:给定\(m\)个长度为偶数的数组,\(L,R\)是初始为空的两个多重集。将每个数组恰好一半的数放入\(L\),另一半放入\(R\),要求最后\(L=R\),要求构造方案或判断无解。\(m\le10^5,\sumn\le10^5\)。思路:首先我们不难想到,对于同一个数组内相同的值,可以成双除去,所以我们可以......
  • Interval GCD 题解
    题目描述给定一个长度为\(\largen\)的数组\(\largea\),以及\(\largem\)条指令(\(n\leq5\times10^5,m\leq10^5\)),每条指令可能是以下两种之一:“\(\large\operatorname{C\l\r\d}\)”,表示把\(\largea[l],a[l+1],…,a[r]\)都加上\(\larged\)。“\(\large\operatorn......
  • CF1264D2 Beautiful Bracket Sequence (hard version) 题解
    括号深度的本质,其实就是删除若干个字符以后使得左边一半全是(,右边一半全是),最终(的个数的最大值。那么就一定存在一个位置使得在这个位置以及之前的字符中(的个数等于这个字符后)的个数。考虑枚举这个位置,记它左边的(的个数为\(a\)、?的个数为\(x\),右边的)的个数......
  • [CF696B] Puzzles 题解
    首先很好想到要用树形\(dp\)。然后设\(dp_i\)为遍历到第\(i\)个点的期望时间,\(sz_i\)代表\(i\)的子树大小。发现有转移方程:\[dp_i=dp_{fa_i}+1+\sum\limits_{j\infa_i且j\nei}sz_j\timesq\]其中\(q\)为一个常数,代表在排列中\(j\)在\(i\)前的概率。很容易发......