构造算法题目积累

cf1304D

题目给出n-1个‘<’‘>’约束,第i个位置的<意味着结果串中a[i]<a[i+1],要求用1~n个数构造出两个串,分别拥有最小和最大的LIS。

思路:我们将升序1~n中连续>的区间执行reverse操作,执行完毕后的结果就是拥有最大LIS的满足约束的结果串。

证明:这种方法利用了全部的上升区间,及下降区间的一侧边界。我们知道对于连续下降区间,最多只能有一个元素被选入LIS,因此整体利用率达到最大。

最短的类似,首先降序n~1,然后不满足约束的reverse。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for(int i=0;i<n;i++)
    ans[i]=i+1;
l=0,r=0;
for(int i=0;i<n-1;i++){
    if(cst[i]=='>'){
        r=i+1;
    }else{
        if(l<r)
            reverse(ans+l,ans+r+1);
        l=i+1;
    }
}
if(l<r)
    reverse(ans+l,ans+r+1);
for(int i=0;i<n;i++){
    printf("%d%c",ans[i],(i==n-1?'\n':' '));
}
全部评论

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
10-25 12:05
已编辑
湖南科技大学 Java
若梦难了:我有你这简历,已经大厂乱杀了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务