AcWing 482. 合唱队形
原题链接
中等
作者:
cht
,
2020-07-31 21:59:25
,
所有人可见
,
阅读 675
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n, a[N], f[N], f2[N];//储存两个数组求最长上升和从右边的最长上升,状态表示
//集合属性:max
int main()
{
scanf("%d", &n);
int res = 0, res2 = 0;//这里用res进行记录
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]), f[i] = 1, f2[i] = 1;//初始化以及输入
for(int i = 2; i <= n; i ++)
{
for(int j = 1; j < i; j ++)
{
if(a[j] < a[i]) f[i] = max(f[i], f[j] + 1), res = max(res, f[i]);//状态转移方程式,最长上升子序列模型
}
}//处理f1数组
for(int i = n - 1; i >= 1; i --)
{
for(int j = n; j > i; j --)
{
if(a[i] > a[j]) f2[i] = max(f2[i], f2[j] + 1), res2 = max(res2, f2[i]);//状态转移方程
}//注意这里要倒着枚举
}//处理f2数组
int ans = 0;//重新开一个新的记录合唱队形的答案
for(int i = 1; i <= n; i ++)
{
ans = max(f[i] + f2[i], ans);//每次把f1和f2加起来算出实际这种情况组成合成队形所需要的总人数,再取一个max
}
cout << n - ans + 1 << endl;//最后输出总人数和实际人数的差,即题目问的到底要踢出去多少人
//别忘记+1(暗示点赞/kk
return 0;
}