Problem Description
N 位同学站成一排,音乐老师要请其中的 (N−K) 位同学出列,使得剩下的 K 位同学排成合唱队形。
合唱队形是指这样的一种队形:设 K 位同学从左到右依次编号为 1,2…,K,他们的身高分别为 T1,T2,…,TK, 则他们的身高满足 T1 < … < Ti > Ti+1 > … > TK(1 ≤ i ≤ K)。
你的任务是,已知所有 N 位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
Input Format
输入的第一行是一个整数 N,表示同学的总数。
第二行有 N 个整数,用空格分隔,第 i 个整数 Ti 是第 i 位同学的身高(厘米)。
Output Format
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
Scope of Data
2 ≤ N ≤ 100,
130 ≤ Ti ≤ 230
Sample Input
8
186 186 150 200 160 130 197 220
Sample Output
4
Idea
- 图片内容来自这里
Program Code
#include <iostream>
using namespace std;
const int N = 110;
int n;
int arr[N];
int main()
{
cin >> n;
for(int i = 0; i < n; ++ i)
cin >> arr[i]; //输入项
int DP_1[n], DP_2[n]; //定义2个DP数组
for(int i = 0; i < n; ++ i)
DP_1[i] = DP_2[i] = 1; //初始化DP数组为1
for(int i = 0; i < n; ++ i) //获得正向DP数据
{
for(int j = 0; j < i; ++ j)
{
if(arr[j] < arr[i])
DP_1[i] = max(DP_1[i], DP_1[j] + 1);
}
}
for(int i = n - 1; i > -1; -- i) //获得逆向DP数据
{
for(int j = n - 1; j > i; -- j)
{
if(arr[j] < arr[i])
DP_2[i] = max(DP_2[i], DP_2[j] + 1);
}
}
int MAX = 0;
for(int i = 0; i < n; ++ i)
MAX = max(MAX, DP_1[i] + DP_2[i] - 1); //减 1 是因为第i个数重复加过一次
cout << n - MAX << endl;
return 0;
}
- If you have any questions,please feel free to communicate with me.