897. 最长公共子序列 线性dp
创始人
2024-03-31 17:15:06
0

给定两个长度分别为 N 和 M 的字符串 A 和 B,求既是 A 的子序列又是 B 的子序列的字符串长度最长是多少。

输入格式

第一行包含两个整数 N 和 M。

第二行包含一个长度为 N 的字符串,表示字符串 A。

第三行包含一个长度为 M 的字符串,表示字符串 B。

字符串均由小写字母构成。

输出格式

输出一个整数,表示最大长度。

数据范围

1≤N,M≤1000

输入样例:

4 5
acbd
abedc

输出样例:

3

y氏dp:

状态表示:f [ i , j ] 

集合: 所有在第一个序列的前 i 个字母中出现,且在第二个序列的前 j 个字母中出现的子序列 

属性:max

状态计算:以s1[ i ] , s2 [ j ] 是否包含在子序列中作为划分依据

 00表示s1 [ i ] 和 s2 [ j ]不出现在子序列f [ i ] [ j ]中

01表示s1 [ i ]不出现在子序列 ,s2 [ j ] 一定出现在子序列 。 10 11 以此类推

其中01 和 10 两种情况并不表示为 f [ i - 1 ][ j ]  和 f [ i ] [ j -1 ]。

f [ i - 1 ][ j ]表示的子序列为所有在第一个序列的前 i-1 个字母中出现,且在第二个序列的前 j 个字母中出现的最大值,并不说明s2[ j ]是一定出现在子序列中的。而01表示的是s1[ i ]不出现在子序列中,s2 [ j ]一定出现在子序列中 。但是,01 情况是包含在f [ i - 1 ][ j ]中的,所以可以用f [ i - 1 ][ j ]来表示 01 情况。 10 情况同理

由于01 和10 是包含的情况多余实际的,所以四种情况加起来会有重复情况,但是我们求的是最大值,所以重复情况并不影响结果。

00 情况是包含在了01 和10 情况里面的,所以代码中不需要体现。

#include
#includeusing namespace std;
const int N = 1e3+10;
int n , m ;
int f[N][N] ; //f[i][j] 所有在s1的前i个字母中和在s2的前j个字母中出现的子序列集合
char s1[N] , s2[N] ;int main()
{cin >> n >> m ;scanf("%s%s", s1+1 , s2+1);for(int i = 1 ;i <= n ; i++ ){for(int j = 1; j <= m ; j ++){f[i][j] = max( f[i-1][j] , f[i][j-1]) ;if(s1[i] == s2[j]) f[i][j] = max( f[i][j] , f[i-1][j-1] + 1) ;}}cout << f[n][m] ;return 0;
}

相关内容

热门资讯

新华社快讯:韩国检方对尹锡悦、... 新华社快讯:负责调查韩国前第一夫人金建希案件的特检组29日发布最终调查结果,对包括前总统尹锡悦、金建...
巩固国家通用语言文字法律地位 本报记者 朱宁宁 我国第一部有关语言文字的专门法律——国家通用语言文字法完成首次大修。 2025年1...
甘肃“十五五”规划建议:加快构... 中共甘肃省委关于制定国民经济和社会发展第十五个五年规划的建议发布,其中提到,加快构建 房地产发展新模...
部署六大重点工作 2026年积... 来源:经济参考报 12月27日至28日在京召开的全国财政工作会议为2026年的财政工作划定了重点。会...
权威抚养权律师推荐:家理(深圳... 在抚养权纠纷中,当事人急需专业且靠谱的律师来维护自身权益。那么,资深抚养权律师哪个好,经验丰富的抚养...
四川拓宽法律援助范围 今年办理... “终于胜诉了!要是按以前的规定,我这种情况属于合同纠纷,不符合法律援助申请条件。”近日,来自自贡市的...
汽车早报|零跑汽车发布首款MP... 重庆追加汽车置换、汽车报废更新补贴 据重庆日报,重庆市商务委消息,为贯彻落实国家部委相关要求,扎实...
自贸试验区昆明片区发布一批区域... 12月26日,中国(云南)自贸试验区昆明片区举行制度创新专题新闻发布会,联合昆明综合保税区发布一批改...
原创 存... “钱存银行,50万以内绝对安全”。 这句话你一定听过,但很多人只知其一,不知其二。 2015年《存款...
美银CEO判断:特朗普关税政策... 智通财经获悉,美国银行首席执行官Brian Moynihan表示,尽管2025年的关税措施曾冲击美国...