做题思路
首先根据题目描述可知,很明显的一个求最长公共子序列问题,对第i位同学左边求最长上升子序列,对右边求最长不上升子序列,利用动态规划思想,最后求出两者相加最大的第i位。最终求出答案。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
int Height[101];
int N;
//0:最长上升序列;
//1:最长不上升序列;
int DP[101][2];
int main(void)
{
cin >> N;
for(int i = 1;i <= N;i++)
{
cin >> Height[i];
}
/*求第i个为起点的最长上升序列*/
for(int i = 1;i <= N;i++)
{
DP[i][0] = 1;
for(int j = 1;j < i;j++)
{
if(Height[j] < Height[i])
{
DP[i][0] = max(DP[i][0],DP[j][0]+1);
}
}
}
/*求第i个为起点的最长不上升序列*/
for(int i = N;i >= 1;i--)
{
DP[i][1] = 1;
for(int j = N;j > i;j--)
{
if(Height[j] < Height[i])
{
DP[i][1] = max(DP[i][1],DP[j][1]+1);
}
}
}
int ans = 0;
for(int i = 1;i <= N;i++)
{
/*同一个第i个身高被重复统计一次*/
ans = max(DP[i][1]+DP[i][0]-1,ans);
}
cout << N-ans << endl;
return 0;
}