[NOIP2004 提高组] 合唱队形 LIS问题
作者:
多米尼克領主的致意
,
2024-04-25 16:03:31
,
所有人可见
,
阅读 3
优解:二分 + 单调栈dp O(nlogn)
普通解:直接LIS模板 + 前后缀dp O(n^2)
因为此题n<=100 数据很小 故用普通解
#include<bits/stdc++.h>
using namespace std;
const int N = 110, INF = 0x3f3f3f3f;
int f[N];
int p[N];
int h[N];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for(int i = 1;i <= n;i++)
{
cin >> h[i];
f[i] = i - 1;
p[i] = n - i;
}
for(int i = 1;i <= n;i++)
{
for(int j = 1;j < i;j++)
{
if(h[i] > h[i - j])
f[i] = min(f[i], f[i - j] + j - 1);
}
}
for(int i = n; i >= 1;i--)
{
for(int j = 1;j < n - i + 1;j++)
{
if(h[i] > h[i + j])
p[i] = min(p[i], p[i + j] + j - 1);
}
}
int ans = INF;
for(int i = 1;i <= n;i++)
{
ans = min(ans, p[i] + f[i]);
}
cout << ans;
return 0;
}