其实,我已经在线性dp那里更新了这个题目
在这里重新写一遍的目的,就是我真的很想吐槽
why??
今天我真的燥死了
我想请问大学不是真正学知识的地方吗,给我搞一些乱七八糟的哈比课,完成一些没有意义的哈比作业,一个开发项目,就照着手册做,跟按照说明书安装软件一样,对我有什么帮助吗???在这里不得不感谢我的室友以及我的同学,是他们help我的作业,让我不至于天天搞这些哈比东西,我能抽出时间做我想做的东西,学习真正的,有用的,奇妙的科学。虽然只是一个刚刚入门的孩子,我也相信自己能有所收获,我希望自己以后也能成为老师们那样的人。最近写的一篇论文,现在写的part有些困难了,虽然只是一篇综述,不过写综述的过程确实比技术性文章更加煎熬吧,饱受着好像学不到什么东西的痛苦,又得不停地查资料,我这篇要独立完成的论文,估计查文献可能得看至少五六百篇,才能引用出一百多篇,加油吧!
然后我还得写报告,一共十几页哦,一点都不多哦,手不会累的哦,因为都没有知觉了哦。
还有课内,模电弄得我神经衰弱了都,天天不想看,总是推拖着明天看,明天我看吗?我还是不看。不过我一会一定要看了!大物也得复习,明天考试!无语啦!插一嘴,大物对我以后学习好像没用吧啊😭。
六级准备摆烂了,其实现在560+可能够用了?不过还得做好万无一失的准备啊,这次大概准备吧,下学期反正还要考的
就说这么多吧,打出来字还挺爽的,今晚要再看看大雾和模电吧,vpn进不去我也登不上Google scholar啊!
加油吧!🐱🏍(这看起来是个冲刺的什么)
题目
就最大公共字序列 自己看线性dp那篇文章!!!! 那篇我很喜欢,为啥访客量那么少 metaverse那篇到是达到了1200多,果然热门啊metaverse!
代码
/*
给定两个长度分别为 N 和 M 的字符串 A 和 B
求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。
输入格式
第一行包含两个整数 N 和 M。
第二行包含一个长度为 N 的字符串,表示字符串 A。
第三行包含一个长度为 M 的字符串,表示字符串 B。
字符串均由小写字母构成。
*/
/*
注意:这里的是公共序列,不是子串,不一定需要相邻
一、状态表示
dp[i][j]表示a的前i和b的前j个的公共序列的集合
dp[i][j]的值是这些公共序列的最大长度
二、状态转移方程
对于某个dp[i][j],我们需要进行划分
以第a[i]和第b[j]个元素进行划分
四种情况:
a[i]包不包含在最长公共序列中(0,1)
b[j]包不包含在最长公共序列中(0,1)
1. 00
dp[i][j]=dp[i-1][j-1]
#2和3要回顾一下网课
2. 01
dp[i-1][j]
3. 10
dp[i][j-1]
4. 11
满足a[i]=b[j]
dp[i][j]=dp[i-1][j-1]+1
*/
#include<iostream>
using namespace std;
const int Num=2000;
int N,M;
char a[Num],b[Num];
int dp[Num][Num];
int main(){
cin>>N>>M;
getchar();
for(int i=1;i<=N;i++)
scanf("%c",&a[i]);
getchar();
for(int i=1;i<=M;i++)
scanf("%c",&b[i]);
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++){
if(a[i]==b[j])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j-1],max(dp[i-1][j],dp[i][j-1]));
}
cout<<dp[N][M]<<endl;
return 0;
}