首页 > 其他分享 >P2516 [HAOI2010] 最长公共子序列

P2516 [HAOI2010] 最长公共子序列

时间:2023-12-16 09:04:48浏览次数:35  
标签:int s2 s1 P2516 HAOI2010 斜线 序列 maxn ll

求方案数,直接从 \(f[i-1][j]\) 和 \(f[i][j-1]\) 转移过来,如果 \(s1[i]==s2[j]\) 就加上 \(f[i-1][j-1]\) ,如果 \(s1[i]!=s2[j]\) 且 \(f[i][j]==f[i-1][j-1]\) 说明两边

转移到了 \(f[i-1][j-1]\) ,减去重复部分 \(f[i-1][j-1]\) 就行了。

比较好的理解方式是画个网格图,如果 \(s1[i]==s2[j]\) 就连条斜线边,第一问相当于是走斜线的次数最多从 \((1,1)\) 到 \((n,m)\) ,第二问相当于是算路径方案数,但

是两个路径不同当且仅当斜线经过不一样。

注意要滚动下数组和边界条件

#include<bits/stdc++.h>
#define il inline
#define maxn 5003
using namespace std;
typedef long long ll;
const ll mod=1e8;
il int read(){
	char c;int f=0,x=0;
	while(!isdigit(c=getchar()))f|=(c=='-');
	while(isdigit(c))x=(x*10)+(c^48),c=getchar();
	return f?-x:x;
}
char s1[maxn],s2[maxn];
int n,m,f[maxn][maxn];
ll f2[2][maxn];
int main(){
	scanf("%s%s",(s1+1),(s2+1));
	n=strlen(s1+1)-1,m=strlen(s2+1)-1;
	f2[1][0]=1;
	for(int i=0;i<=m;i++)f2[0][i]=1;
	int p=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(s1[i]!=s2[j])f[i][j]=max(f[i-1][j],f[i][j-1]);
			else f[i][j]=max(f[i][j],f[i-1][j-1]+1);
			int tmp=f[i][j];        
			if(f[i-1][j]==tmp)f2[p][j]=(f2[p][j]+f2[p^1][j])%mod;
			if(f[i][j-1]==tmp)f2[p][j]=(f2[p][j]+f2[p][j-1])%mod;
			if(s1[i]==s2[j])f2[p][j]=(f2[p][j]+f2[p^1][j-1])%mod;
			if(s1[i]!=s2[j]&&f[i][j]==f[i-1][j-1])f2[p][j]=((f2[p][j]-f2[p^1][j-1])%mod+mod)%mod;
		}                      
		p^=1;
		for(int j=1;j<=m;j++)f2[p][j]=0;                                    
	}
	printf("%d\n%d\n",f[n][m],f2[p^1][m]);
	return 0;                    
}

标签:int,s2,s1,P2516,HAOI2010,斜线,序列,maxn,ll
From: https://www.cnblogs.com/blueparrot/p/17904476.html

相关文章

  • 基因组序列比对(read alignment)
    基因组序列比对(readalignment)技术,是将测序得到的read与已有的参考基因组进行比对,找到read与参考基因组匹配的对应位置,继而得到序列比对的详细结果。由于参考基因组碱基数极多,测序得到的read数据量极大,且测序的DNA序列中存在各种碱基变异和测序错误,因此不能直接将read与参考基因......
  • asp.net core 使用newtonsoft完美序列化WebApi返回的ValueTuple
    https://www.cnblogs.com/kugar/p/12334210.html   由于开发功能的需要,又懒得新建太多的class,所以ValueTuple是个比较好的偷懒方法,但是,由于WebApi需要返回序列化后的json,默认的序列化只能将ValueTuple定义的各个属性序列化成Item1...n  但是微软还是良心的为序列......
  • 128. 最长连续序列
    1.题目介绍给定一个未排序的整数数组\(nums\),找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 \(O(n)\)的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4。示例......
  • Hadoop 数据类型及序列化
    1.Hadoop数据类型Java类型HadoopWritable类型BooleanBooleanWritableWritableWritableWritableWritableWritableWritableWritableWritableWritable2.为何Hadoop有自身序列化与反序列化Java自身的序列化除去本身Bean的数据......
  • Aapche Dubbo Java反序列化漏洞(CVE-2019-17564)
    AapcheDubboJava反序列化漏洞(CVE-2019-17564)漏洞描述ApacheDubbo是一款高性能、轻量级的开源JavaRPC服务框架。Dubbo可以使用不同协议通信,当使用http协议时,ApacheDubbo直接使用了Spring框架的org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter类做远程......
  • 关于c++序列化
    对于一个复杂数据对象的存储和装载有很多方式,比如自定义的文本或者2进制格式,以及对应的读取和写入程序。也有一些适应力较强比较通用的方式,文本的有xml和json。尤其是xml文件查看起来比较方便。但是xml的最大问题就是装载和保存都比较慢。装载1个大文件足以把头发等白:)在c++里......
  • 基于机器学习的时间序列温度预测
    本次研究是使用GRU模型和GRU-Attention模型对长时间序列温度数据进行预测拟合,对于这两个模型有兴趣的可以去网上了解一下,首先是日数据预测,由于日数据存在缺失值需要对缺失值进行填补,在对存在缺失值的数据中我使用三次样方插值对数据进行处理,其代码如下:importpandasaspdimp......
  • 【算法】【线性表】最长连续序列
    1 题目给定一个未排序的整数数组num,找出最长连续序列的长度。样例1:输入:num=[100,4,200,1,3,2]输出:4解释:这个最长的连续序列是[1,2,3,4].返回所求长度42 解答publicclassSolution{/***@paramnum:Alistofintegers*@......
  • 解读传奇补丁什么是Pak文件什么是WIL序列号
    Pak文件是GOM引擎自定义图片资源格式,支持密码功能,可以使用工具包中的WIL编辑器创建修改等编辑,很多脚本命令和功能都会使用这个WIL序号,M2-查看-列表信息二这里可以自定义添加,Pak文件读取规则详细查看登录器配置器Pak文件读取规则和Pak密码需要在登录器配置中配置。什么是Pak文件Pa......
  • php反序列化
    反序列化中常见的魔术方法1.  __wakeup()//执行unserialize()时,先会调用这个函数2.  __sleep()//执行serialize()时,先会调用这个函数3.  __destruct()//对象被销毁时触发4.  __call()//在对象上下文中调用不可访问的方法时触发5.  __callStatic()//在静......