2020牛客暑期多校训练营(第五场)D-Drop Voicing

Drop Voicing

https://ac.nowcoder.com/acm/contest/5670/D

题目大意

给定一个1~n(2<=n<=500)的排列,有两种操作:
1.将倒数第二个数放到开头;
2.将第一个数放到最后;
连续的操作1(包括1次)称为一段。现在要将排列变成1~n,要使得段数尽可能少,输出这个最小值。

解题思路

我们可以想象出一个有n个数的圆盘,且有一个指针初始时指向最后一个元素处。
在这个圆盘上,连续的操作1,等价于改变指针指向的数的位置;而连续的操作2,等价于改变指针的位置。
所以,在这里只需要找出环上最长的一个上升子序列之后,再调整其余每一个数,所以答案就是剩下数的数量。

AC代码

#include<bits/stdc++.h>
using namespace std;
int n,a[2510],dp[2510],ans;
int find(int l,int r)
{
    int m=1,i,j;
    for(i=l;i<=r;i++)
        dp[i]=1;
    for(i=l+1;i<=r;i++)
    {
        for(j=l;j<i;j++)
            if(a[j]<a[i]) dp[i]=max(dp[i],dp[j]+1);
        m=max(m,dp[i]);
    }
    return m;
}
int main()
{
 int i;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",a+i);
        a[i+n]=a[i];
    }
    for(i=1;i<=n;i++)
        ans=max(ans,find(i,i+n-1));
    printf("%d\n",n-ans);
}


2020牛客暑期多校训练营 文章被收录于专栏

只是题解,可参考,可学习,可点赞:)

全部评论

相关推荐

11-11 17:45
门头沟学院 Java
扶老蟑螂过马路被无证...:1. 技术栈那里把数据结构删了,小中厂用不上,大厂手撕能难死你,linux那里可以考虑删掉,还不如换个git团队协作开发 2.不要使用一些项目不匹配的技术,例如分库分表和你上边的ddd,真正使用ddd的都是【超】大规模,大部分都仍然使用多模块聚合mvc,这样虽然看起来高大上,但是新增了前期协定需求跟后期维护的成本,因为开发中都是选择最适合当起版本的开发方式跟中间件,这样反而会体现你为了学而学(因为可能面试官都不完全熟悉ddd,然后问你你也回答不出深度) 3.项目写了很多的redis使用,为什么技术栈不写上redis 4.项目技术栈跟业务需求高度重合,完全可以整合成一个,然后再去弄一个感兴趣的其他业务或者轮子,或者把上面的一个换下包装 5.奖项自己编一点奖学金,加个四六级,删掉蓝桥杯
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务