文章

14

粉丝

230

获赞

26

访问

70.4k

头像
记录最长递减子序列
P1836 山东大学机试
发布于2022年8月22日 13:16
阅读数 5.8k

最长递减子序列不唯一,题目的意思应该是输出从左往右第一个符合条件的序列

通过dp数组,可以得出最长递减子序列的长度

通过一个辅助数组记录“前驱”,就是当前dp值的来源

原序列   9 4 3 2 5 4 3 2
dp数组  1 2 3 4 2 3 4 5
pre数组 0 1 2 3 1 5 6 7
dp数组中5的来源是7,意思是5对应的数字2,其前一个数字应该是第7个数字(3),

3的前驱是第6个数字(4),

4的前驱是第5个数字(5),

5的前驱是第1个数字(9),

5的前驱是是0,代表到此结束

#include<bits/stdc++.h>

using namespace std;


int a[100001];
int dp[100001];
int pre[100001];
int num;
void getLcs()
{
    int ans=0;
    int res[100001];
    for(int i=1; i<=num; i++)
    {
        dp[i]=1;
        for(int j=1; j<i; j++)
        {
            if(a[j]>a[i]&&dp[j]+1>dp[i])
            {
                dp[i]=dp[j]+1;
                pre[i]=j;

            }
        }
        ans=max(ans,dp[i]);

    }

    int index=0;
    for(int i=1; i<=num; i++)
    {
        if(dp[i]==ans)
            index=i;

    }
    int cmt=ans;
    for(int i=index; i!=0; i=pre[i])
        res[cmt--]=a[i];
    for(i...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发