题意:给两个序列(长度达10^5,序列内的数都不同且都小于10^5),求这两个序列的最长公共序列的长度

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <map>
#define LL long long
#define N 100100
using namespace std;
int a[N], b[N], dp[N];    //nyoj  See LCS again
/*
题意:给两个序列(长度达10^5,序列内的数都不同且都小于10^5),求这两个序列的最长公共序列的长度
解法:预处理,把相同的项记录其数组位置,将题目转化为求这个数组的最长单调递增序列的长度(用二分法优化)
*/
int binarysearch(int key, int len)
{
	int l=0, r=len-1, mid;
	while(l<=r)
	{
		mid=(l+r)>>1;
		if(dp[mid]>key)
		{
			r=mid-1;
		}
		else if(dp[mid]<key)
		{
			l=mid+1;
		}
		else return mid;
	}
	return l;
}

int main()
{
	int n, m, t, j, k, l;
	while(scanf("%d%d", &n, &m)!=EOF)
	{
		memset(a, 0, sizeof(a));
		for(t=1; t<=n; ++t)
		{
			scanf("%d", &k);
			a[k]=t;
		}
		for(t=j=0; t<m; ++t)
		{
			scanf("%d", &k);
			if(a[k])
			{
				b[j++]=a[k];
			}
		}
		dp[0]=b[0];
		for(t=l=1; t<j; ++t)
		{
			k=binarysearch(b[t], l);
			dp[k]=b[t];
			if(k+1>l)
				l=k+1;
		}
		printf("%d\n", l);
	}
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是使用 Python 语言实现的代码: ```python num_list = [] for i in range(10): num = int(input("请输入第%d个:" % (i+1))) num_list.append(num) # 前5个排序 num_list[:5] = sorted(num_list[:5]) # 后5个排序 num_list[5:] = sorted(num_list[5:], reverse=True) print("排序后的结果为:", num_list) ``` 运行这段代码后,会提示用户输入10,然后将前5个进行从小到大的排序,后5个进行从大到小的排序,最后输出排序后的结果。 ### 回答2: 题意是从键盘输入10,并分为两组排序输出,前5个从小到大,后5个从大到小。 解决这个问题的一种方式是使用冒泡排序法。具体步骤如下: 1. 首先,从键盘输入10,可以使用input函获取用户输入的据,并将其存储在一个列表中。 2. 接下来,使用冒泡排序法对前5个进行从小到大的排序。冒泡排序法的基本思想是从左到右依次比较两个相邻的元素,如果顺序不对则交换位置,直到所有元素都排好序为止。 3. 然后,使用冒泡排序法对后5个进行从大到小的排序。与第2步类似,不过比较时改为从右到左进行比较。 4. 最后,输出排序后的结果,前5个从小到大,后5个从大到小。 下面是一个简单的Python代码实现: ```python # 从键盘输入10 numbers = [] for i in range(10): num = int(input("请输入一个:")) numbers.append(num) # 对前5个进行从小到大排序 for i in range(5): for j in range(4-i): if numbers[j] > numbers[j+1]: numbers[j], numbers[j+1] = numbers[j+1], numbers[j] # 对后5个进行从大到小排序 for i in range(5, 9): for j in range(9, i, -1): if numbers[j] > numbers[j-1]: numbers[j], numbers[j-1] = numbers[j-1], numbers[j] # 输出排序后的结果 print("前5个从小到大排序为:", numbers[:5]) print("后5个从大到小排序为:", numbers[5:][::-1]) ``` 以上就是一种解决该问题的方法,通过冒泡排序法使得前5个从小到大排序,后5个从大到小排序,并输出结果。 ### 回答3: 可以使用Python来实现从键盘输入10,并对这10进行排序。代码如下: ```python # 从键盘输入10 numbers = [] for i in range(10): num = int(input("请输入第{}个:".format(i+1))) numbers.append(num) # 前5个由小到大排序 sorted_numbers1 = sorted(numbers[:5]) # 后5个由大到小排序 sorted_numbers2 = sorted(numbers[5:], reverse=True) # 输出结果 print("前5个由小到大排序结果:", sorted_numbers1) print("后5个由大到小排序结果:", sorted_numbers2) ``` 在运行时,程序会依次要输入10,然后将前5个进行小到大排序,后5个进行大到小排序,并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值