最长递增子序列

合唱队形

http://www.nowcoder.com/questionTerminal/cf209ca9ac994015b8caf5bf2cae5c98

相当于求两个最长递增子序列吧。emmm,还没看大佬写的,暂且是这么个想法。

dp1[i]表示以a1[i]结尾的最长递增子序列

然后把a1[i]转置成a2[i],接着求以a2[i]为结尾的最长递增子序列dp2[i],(相当于求以a[i]为结尾的左边正序一个最长递增,后边倒序的一个最长递减)

然后对应的a1[i]和a2[n-1-i]相加起来,求得最大的 max

再用N-(max-1) 就是结果。

1 3 5 7 4 2 0
注意一定要减一,因为上面的例子, 1 3 5 7算了一次7,0 2 4 7也算了一次7

#include<iostream>
using namespace std;
const int maxn=100;
int a1[maxn],a2[maxn],dp1[maxn],dp2[maxn];
int main(){
    int n;
    while(cin>>n){
        for(int i=0;i<n;i++){
            cin>>a1[i];
            a2[n-1-i]=a1[i];
        }
        for(int i=0;i<n;i++){
            dp1[i]=1;dp2[i]=1;
            for(int j=0;j<i;j++){
                if(a1[j]<a1[i])
                    dp1[i]=max(dp1[i],dp1[j]+1);
                if(a2[j]<a2[i])
                    dp2[i]=max(dp2[i],dp2[j]+1);
            }
        }
        int res=0;
        for(int i=0;i<n;i++){
            dp1[i]+=dp2[n-1-i];
            res=max(res,dp1[i]);
        }
        cout<<n-res+1<<endl;
    }
    return 0;
} 
全部评论
大佬np,我抄都抄错了。。。
点赞
送花
回复
分享
发布于 2020-12-15 23:01
a1[i]和a2[n-1-i]相加起来?
点赞
送花
回复
分享
发布于 2023-03-27 22:17 河南
滴滴
校招火热招聘中
官网直投
你是魔鬼吗?
点赞
送花
回复
分享
发布于 03-19 22:56 湖北

相关推荐

5 1 评论
分享
牛客网
牛客企业服务