| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 16494 | Accepted: 5406 |
Description
Write a program that, knowing the height of each soldier, determines the minimum number of soldiers which have to get out of line.
Input
There are some restrictions:
• 2 <= n <= 1000
• the height are floating numbers from the interval [0.5, 2.5]
Output
Sample Input
8 1.86 1.86 1.30621 2 1.4 1 1.97 2.2
Sample Output
4
Source
题意是从原序列中移走几个士兵,得到一个新的序列,且这个序列满足 每个士兵向左或向右至少一个方向都不存在比他高或和他一样高的要求最少移走几个人
从前到后求一遍最长递增子序列,在从后到前求一遍
因为数据不大,最后两层for循环遍历求出最大值
又错在了忘记了dp【i】并非前i个的最长递增子序列长度,而应该是dp【1~i】里的最大值,所以最后只用了一层for循环遍历,谨记!
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
typedef long long ll;
using namespace std;
int main()
{
int n,dp[2000],dp1[2000],i,j,ans;
double k[2000];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lf",&k[i]);
for(i=0;i<n;i++)
dp[i]=1,dp1[i]=1;
for(i=1;i<n;i++)
{
for(j=0;j<i;j++)
{
if(k[i]>k[j])
dp[i]=max(dp[i],dp[j]+1);
}
}
for(i=n-1;i>=0;i--)
{
for(j=n-1;j>i;j--)
{
if(k[i]>k[j])
dp1[i]=max(dp1[i],dp1[j]+1);
}
}
ans=dp[0]+dp1[0]-1;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
ans=max(ans,dp[i]+dp1[j]);
for(i=1;i<n;i++)
ans=max(ans,dp[i]+dp1[j]-1);
printf("%d\n",n-ans);
return 0;
}
393



被折叠的 条评论
为什么被折叠?



