举例说明 2 1 3 4 5 最长值连续上升子序列为2 3 4 5 而不是最长连续(位置相邻)上升子序列 1 3 4 5
自己写了个码,但是超时了...
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int a[N],dp[N];
int main()
{
int n,i,j;
while(~scanf("%d",&n))
{
for(i=0;i<=n-1;i++)
{
scanf("%d",&a[i]);
dp[i]=1;
}
int maxa=1;
for(i=1;i<=n-1;i++)
{
for(j=i-1;j>=0;j--)
{
if(a[j]+1==a[i])
{
dp[i]=dp[j]+1;
if(dp[i]>maxa)
maxa=dp[i];
break;
}
}
}
printf("%d\n",n-maxa);
}
return 0;
}
我觉得思路还是对的,需要改进
在网上看到一个很巧妙的码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<string>
#include<vector>
#define N 1100000
#define eps 1e-7
#define LL long long
using namespace std;
int m[10];
int a[N],b[N];
int main()
{
#ifdef CDZSC
freopen("i.txt","r",stdin);
#endif
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
scanf("%d",a+i);
b[i]=0;
}
for(int i=1;i<=n;i++)
{
b[a[i]]=b[a[i]-1]+1;
}
int ans=-1;
for(int i=1;i<=n;i++)
{
ans=max(b[i],ans);
}
printf("%d\n",n-ans);
}
return 0;
}