题意:给定1到n的k个排列。求最长公共子序列的长度。
这题是看了官方题解,才会的。
#include <iostream>
#include <cstdio>
using namespace std;
int n,k;
int position[5][1000];//记录position[i][j]记录第i行中,数字j出现的位置。
int a[5][1000];//记录数列
int dp[1000];//dp[i]表示,以下标i结尾的最长公共子序列长度。
int main(void)
{
while(cin>>n>>k){
for(int i=0;i<k;i++){
for(int j=0;j<n;j++){
scanf("%d",&a[i][j]);
position[i][--a[i][j]]=j;
}
}
int ans=0;
for(int j=0;j<n;++j){//对于 j
int maxn=0;
for(int p=0;p <j;++p){//对于 以(j之前的每个点) 结尾的最长序列,判断j可不可以加进去
int i;
for(i=1;i<k&&position[i][a[0][p]]<position[i][a[0][j]];++i) ;
if(i==k&&dp[p]>maxn){//求这些可以加进去的点中,dp值最大的一个
maxn=dp[p];//
}
}
dp[j]=maxn+1;//本点dp值=最大dp值加上1
ans=max(ans,dp[j]);//求每一点dp值最大的一个。
}
printf("%d\n",ans);
}
return 0;
}
本文探讨了如何解决给定1到n的k个排列时寻找最长公共子序列的问题,通过使用动态规划方法,实现了一种有效求解策略。

1873

被折叠的 条评论
为什么被折叠?



