P1091 [NOIP2004 提高组] 合唱队形
题面
位同学站成一排,音乐老师要请其中的 位同学出列,使得剩下的 位同学排成合唱队形。
合唱队形是指这样的一种队形:设 位同学从左到右依次编号为 … ,他们的身高分别为 … ,则他们的身高满足 … 。
你的任务是,已知所有 位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
思路
其实思路很简单,就是跑两遍最长上升子序列,然后再枚举中间的求最大值。
最长上升子序列问题
本题 算法可过。
方程如下:
代码
#include <bits/stdc++.h>
using namespace std;
int n, a[105], f[3][105], ans = INT_MIN;
int main() {
cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i];
for (int i = 1; i <= n; i++) {
for (int j = 0; j < i; j++) {
if (a[i] > a[j]) {
f[0][i] = max(f[0][i], f[0][j] + 1);
}
}
}
for (int i = n; i >= 1; i--) {
for (int j = n + 1; j > i; j--) {
if (a[i] > a[j]) {
f[1][i] = max(f[1][i], f[1][j] + 1);
}
}
}
for (int i = 1; i <= n; i++) {
ans = max(f[0][i] + f[1][i]-1, ans);
}
ans=n-ans;
cout << ans << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】