最长公共子序列

问题描述

有两个数字序列,序列X和序列Y,求这两个序列的最长公共子序列。

输入格式

输入
第一行,两个不超过500的整数,表示两个序列的长度。
接下来有两行,第一行有空格间隔的x个整数,表示序列x
第二行有空格间隔的y个整数,表示序列y (序列x,y中的整数大小不超过200)

输出格式

输出
输出文件第一行为一个非负整数,表示所求得的最长公共子序列长度

样例输入

7 6
15 10 7 10 3 15 10
10 3 7 15 10 15 

样例输出

4

/*
时间:4.30
状态:
f[i][j]表示x数组的前i个与y数组的前j个中最长公共子序列的长度
方程:1.当x[i] == y[j]:
		f[i][j] = f[i - 1][j - 1] + 1
		(f[i - 1][j - 1]表示x数组的前i - 1个与y - 1数组的前j个中最长公共子序列的长度
		再加当前相同的x[i]与y[j]这一个)
		其他:
		f[i][j] = max(f[i][j - 1], f[i - 1][j])
		(f[i][j - 1]表示x数组的前i个与y数组的前j - 1个中最长公共子序列的长度)
		(f[i - 1][j]表示x数组的前i - 1个与y数组的前j个中最长公共子序列的长度) 
		(再选最大值)
边界:
(1) 1 <= i <= n
(2) 1 <= j <= m
问题:
1.注意数组大小 
*/
#include <bits/stdc++.h>

using namespace std;

int x[500 + 5] = { };
int y[500 + 5] = { };
int f[500 + 5][500 + 5] = { };//1 

int main()
{
	int n, m;
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= n; i++){
		scanf("%d", &x[i]);	
	}
	for(int i = 1; i <= m; i++){
		scanf("%d", &y[i]);	
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			if(x[i] == y[j]){
				f[i][j] = f[i - 1][j - 1] + 1;
			}
			else{
				f[i][j] = max(f[i][j - 1], f[i - 1][j]);
			}
		}
	}
	printf("%d", f[n][m]);
	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值