1010: 广播操比赛
时间限制: 1 Sec 内存限制: 128 MB提交: 75 解决: 23
题目描述
宣城校区要举行一年一度的广播操比赛,13级计算机某班N位同学站成一排, 辅导员要请其中的(N-K)位同学出列,使得剩下的K位同学排成广播操队形。广播操队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足:
T1<...<Ti>Ti+1>…>TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成广播操队形。
输入
题目有多组输入数据
输入的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
输出
对于每组数据
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
样例输入
8186 186 150 200 160 130 197 220
样例输出
4
dp 类似于LIS那种。正着dp一遍反着一遍就得结果了。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef long double LD;
const double pi = acos(-1.0);
///
///
int main(int argc, char**argv) {
ios_base::sync_with_stdio(0); cin.tie(0);
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int n;
while(cin>>n){
int st[200];
for(int i=1;i<=n;i++){
cin>>st[i];
}
int dp1[200];
int dp2[200];
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(st[i]>st[j]&&dp1[i]<dp1[j]+1) dp1[i]=dp1[j]+1;
}
}
for(int i=n;i>=1;i--){
for(int j=n;j>i;j--){
if(st[i]>st[j]&&dp2[i]<dp2[j]+1) dp2[i]=dp2[j]+1;
}
}
int maxl=0;
for(int i=1;i<=n;i++){
maxl=max(maxl,dp1[i]+dp2[i]);
}
cout<<n-maxl-1<<endl;
}
//system("pause");
return 0;
}
//END