Seq
Description
由于hyf长得实在是太帅了,英俊潇洒,风流倜傥,人见人爱,花见花开,车见车载。有一群MM排队看hyf。每个MM都有自己独特的风格,由于hyf有着一颗包容的心,所以,什么风格的MM他都喜欢……
但是,hyf有一个特别的要求,他不希望总是看到风格得差不多的MM,更加特别的是,如果两个MM风格完全一样,hyf不会有任何意见。
现在,hyf希望从去看他的MM中,去掉一些MM,从而使得相邻2个MM的风格值的差(绝对值)不为1。自然地,hyf希望去掉的MM越少越好。
Input
第一行一个整数N;
第2~N+1行N个整数,第i个为ci。表示第i个MM的风格值。
Output
一个数,表示最少要去掉的MM数。
Sample Input
6
4
2
2
1
1
1
Sample Output
2
数据规模:
对于30%的数据,N≤20
对于70%的数据,N≤100,ci ≤ 2000
对于100%的数据,N≤1000 0 ≤ ci ≤ 2000
没事干做水题。。我看见14级的同学们这道题竟没有人做出来,这么明显的模型,真是为大绵中的竞赛担忧啊。。(其实我更该为自己担忧。。)
这个是最简单的最长非降子序列的模型,只是条件改变成为abs(v[i]-v[j])>1或v[i]==v[j]
因为急着测。。所以悲剧地WA90了。。因为着急就忘记了f[i]表示的是要选择i的最优值。然后还有OJ的坑爹数据超范围。
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#define max(a,b) ((a)>(b)?(a):(b))
long v[2010];
long f[2010];
long getint()
{
long rs=0;bool sgn=-1;char tmp;
do tmp=getchar();
while (!isdigit(tmp)&&tmp-'-');
if (tmp=='-'){sgn=0;tmp=getchar();}
do rs=(rs<<3)+(rs<<1)+tmp-'0';
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
}
int main()
{
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
long n = getint();
for (long i=1;i<n+1;i++)
{
v[i] = getint();
}
v[0] = -0x7f7f7f7f;
f[0] = 0;
for (long i=1;i<n+1;i++)
{
f[i] = -0x7f7f7f7f;
for (long j=0;j<i;j++)
{
if (v[i]-v[j]>1||v[i]-v[j]<-1||v[i]==v[j])
{
f[i] = max(f[j]+1,f[i]);
}
}
}
long ans = -0x7f7f7f7f;
for (long i=1;i<n+1;i++)
{
ans = max(ans,f[i]);
}
printf("%ld",n-ans);
return 0;
}