C++笔试强训day40-目录

因为(1 <= i <= k

所以该队形可以是这三种情况。

我们可以定一个人为最高点的那个人,然后求得左边的最多人数(x)(呈上升趋势)(包含最高点),再求右边的最多人数(y)(呈下降趋势)(包含最高点),然后我们要求的即为 x + y - 1

所以我们就将题目变相改成求左边的最长上升子序列,右边的最长下降子序列(可以变换为从右向左看求最长上升子序列

问题就转化为求最长上升子序列了:

即dp问题:

#include <iostream>
using namespace std;
const int N = 1010;

int n;
int f[N], g[N], a[N];
int main() {
    cin >> n;
    for(int i = 1; i <= n; ++i)
        cin >> a[i];

    for(int i = 1; i <= n; ++i)
    {
        f[i] = 1;
        for(int j = 1; j < i; ++j)
        {
            if(a[i] > a[j])
                f[i] = max(f[j] + 1, f[i]);            
        }
    }


    
    for(int i = n; i >= 1; --i)
    {
        g[i] = 1;
        for(int j = n; j > i; --j)
        {
            if(a[i] > a[j])
                g[i] = max(g[j] + 1, g[i]);            
        }
    }

    int ret = 0;
    for(int i = 1; i <= n; ++i)
        ret = max(f[i] + g[i] - 1, ret);
    cout << n - ret << endl;
    return 0;
}
上一篇:Nios II 实现流水灯实验


下一篇:阿里云开发者社区有奖征文活动,期待您出文相助