题目链接
题目描述
输入格式
输出格式
输入样例
8
186 186 150 200 160 130 197 220
输出样例
4
题目分析
code
#include <iostream>
#include <cstring>
using namespace std;
const int MAX = 105;
const int INF = 0x3fffffff;
int a[MAX];
int dp[MAX];
int n;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
a[0] = 0; //初始化,空段
a[n + 1] = 0;
int ans = INF;
//枚举中间点
for (int i = 1; i <= n; i++)
{
memset(dp, 0, sizeof(dp));
int cnt = 0;
//左边为上升序列
for (int j = 1; j <= i; j++)
for (int k = 0; k < j; k++)
if (a[k] < a[j])
dp[j] = max(dp[j], dp[k] + 1);
cnt += i - dp[i]; //左边出队的人数
//右边为下降序列
dp[i] = 0; //注意清零
for (int j = n; j >= i; j--)
for (int k = n + 1; k > j; k--)
if (a[k] < a[j])
dp[j] = max(dp[j], dp[k] + 1);
cnt += n - i + 1 - dp[i]; //右边出队的人数
ans = min(ans, cnt); //取最小值
}
cout << ans;
return 0;
}
- 无注释版
#include <iostream>
#include <cstring>
using namespace std;
const int MAX = 105;
const int INF = 0x3fffffff;
int a[MAX];
int dp[MAX];
int n;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
a[0] = 0;
a[n + 1] = 0;
int ans = INF;
for (int i = 1; i <= n; i++)
{
memset(dp, 0, sizeof(dp));
int cnt = 0;
for (int j = 1; j <= i; j++)
for (int k = 0; k < j; k++)
if (a[k] < a[j])
dp[j] = max(dp[j], dp[k] + 1);
cnt += i - dp[i];
dp[i] = 0;
for (int j = n; j >= i; j--)
for (int k = n + 1; k > j; k--)
if (a[k] < a[j])
dp[j] = max(dp[j], dp[k] + 1);
cnt += n - i + 1 - dp[i];
ans = min(ans, cnt);
}
cout << ans;
return 0;
}