繁繁的队列(DP)

mac2024-11-08  14

题目描述 繁繁有一个双向队列,队列里有数字1-N这N个数字,繁繁每次可以从队列中任意拿出一个数字,将其放在队列的头部或者队列的尾部,不停这样操作,直到队列变成升序,求最小操作次数。

输入 第一行一个数字N(N<=50000) 接下来N行,每行一个数字

输出 一个数表示最小操作次数

样例输入 5 2 5 3 4 1

样例输出 2

提示 对于样例1,5个数:2,5,3,4,1 step1:5放到队尾→2,3,4,1,5; step2:1放到队头→1,2,3,4,5; 需要两步操作。

对于30%的数据,N<=100 对于50%的数据,N<=1000 对于100%的数据,N<=50000

思路 该题要求最小操作次数,所以只要求该序列中最长的上升子序列即可

代码实现

#pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=200005; const int M=10005; const int INF=0x3f3f3f3f; const int mod=1000000007; typedef pair<int,int>P; int n,a[N],dp[N],ans; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { dp[i]=1; for(int j=1;j<i;j++) if(a[i]==a[j]+1) dp[i]=max(dp[i],dp[j]+1); ans=max(ans,dp[i]); } printf("%d\n",n-ans); return 0; }
最新回复(0)