Codeforces 463D. Gargari and Permutations【DP】

题目大意:

给出1~n的k个排列(2<=k<=5),要求其中的最长公共子序列。

做法:

算是不难的DP,dp[i]表示以i为结尾的最长公共子序列的长度,由于每个数在一个排列中只可能出现一次,我们用一个二维数组pos[i][j]表示数字j在第i行出现在第几个位置,再用一个数组cnt[i] 记录i出现了多少次;当第i个数出现了k次之后,说明能够以该数为结尾构成公共子序列,那么dp[i]=max(dp[j]+1),其中i,j满足pos[u][i]>pos[u][j](1<=u<=k);当然,为了节约时间,我们可以把之前已经计算过的dp[i]值的下标存到vector里面,这样只需要遍历这个vector找出符合条件的数即可.

代码:
#include 
#include 
#include 
#include 
#define N 1010
using namespace std;
int pos[6][N],cnt[N],a[6][N],dp[N];
vector q;
int main()
{
    int n,k,ans=0;
    scanf("%d%d",&n,&k);
    for(int i=0;i


你可能感兴趣的:(动态规划,ACM之路,codeforces,数据结构)