文章

12

粉丝

0

获赞

9

访问

803

头像
最长递减子序列 题解:采用从后往前dp,设置数组保存每一个子序列的下一个元素的下标
P1836 山东大学机试
发布于2026年2月24日 22:28
阅读数 27

通过率40%,复杂度是n2,怀疑是超时的原因

为什么采用从后往前的dp:如果使用从前往后的dp,next数组中保存的是 该元素 从头到该元素这个区间中最长递减子序列的上个元素的下标,等dp结束后,根据next数组中保存的子序列下标遍历数组时,输出是倒序,故采用从后往前的dp。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    vector<int> buf;
    vector<int> dp;
    vector<int> next;
    int x;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        cin>>x;
        buf.push_back(x);
        dp.push_back(1);
        next.push_back(-1);
    }
    int maxn=0;
    int start=0;
    for(int i=n-2; i>=0; i--)
    {
        for(int j=n-1; j>i; j--)
        {
            if(buf[i]>buf[j] && dp[j]+1>dp[i])
           ...

登录查看完整内容


登录后发布评论

1 条评论
岸上的乌龟
2026年2月24日 23:00

太离谱了,不是超时的原因,是测试点的原因

输入测试:

5

9 4 8 2 1

此程序输出9 8 2 1

而答案是9 4 2 1

dp[j]+1>dp[i]应改成dp[j]+1>=dp[i] 此时正确率80

输入测试:

6

9 4 3 20 15 10

此程序输出20 15 10

而答案是9 4 3

将if(dp[i]>maxn)改成if(dp[i]>=maxn) 此时ac

赞(0)
回复给: