标签:
| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 13624 | Accepted: 4392 |
Description
Input
Output
Sample Input
8 1.86 1.86 1.30621 2 1.4 1 1.97 2.2
Sample Output
4
题意:删除最少的人数,使得a1 < a2 < a3 < ... < a(i ) <=> a(i+1) > a(i+2) > .. a(n-1) >a(n)。
思路:求出从左到右的最长上升子序列,求出从右到左的最长上升子序列,然后用n-相加的和,注意这里有个坑,就是出现中间值为1个 或者中间值为2个的情况。例如1 2 3 2 1 和 1 2 3 3 2 1.这两种情况要分别考虑。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
const int inf=0x3f3f3f3f;
int dp1[1010];
int dp2[1010];
double a[1010];
int main()
{
int n,i,j;
while(~scanf("%d",&n)){
for(i=0;i<n;i++)
scanf("%lf",&a[i]);
for(i=0;i<n;i++){
dp1[i]=dp2[i]=1;
}
for(i=1;i<n;i++)
for(j=0;j<i;j++)
if(a[i]>a[j]&&dp1[i]<dp1[j]+1)
dp1[i]=dp1[j]+1;
for(i=n-2;i>=0;i--)
for(j=n-1;j>i;j--)
if(a[i]>a[j]&&dp2[i]<dp2[j]+1)
dp2[i]=dp2[j]+1;
int maxx=-inf;
for(i=0;i<n;i++)
maxx=max(maxx,dp1[i]+dp2[i]-1);//中间值为1个的时候
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
maxx=max(maxx,dp1[i]+dp2[j]);//中间值为2个的时候
printf("%d\n",n-maxx);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/u013486414/article/details/43404405