1017. 怪盗基德的滑翔翼

发布时间 2023-03-29 17:20:03作者: zhangk1988

题目描述

给一个正整数数组,可以选起点和方向,问最长的严格下降子序列的长度?

f1-求两次最长上升子序列

基本分析

  1. 可以选方向怎么考虑?枚举左或者右
  2. 可以选起点怎么考虑?枚举i。向左滑翔,从0到i的最长上升子序列长度;向右滑翔:从n-1到i的最长上升子序列长度

代码

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;
int a[N], f[N], g[N];

int k, n;

int main()
{
    scanf("%d", &k);
    while (k--)
    {
        scanf("%d", &n);
        
        for (int i = 0; i < n; i++)  scanf("%d", &a[i]);
        
        int ans = 0;
        for (int i = 0; i < n; i++)
        {
            f[i] = 1;
            for(int j = 0; j < i; j++)
            {
                if (a[i] > a[j]) 
                    f[i] = max(f[i], f[j] + 1);
            }
            // 以i为右端点的最长上升
            ans = max(ans, f[i]);
        }
        
        for (int i = n-1; i >= 0; i--)
        {
            g[i] = 1;
            for (int j = n-1; j > i; j--)
            {
                if (a[i] > a[j]) 
                    g[i] = max(g[i], g[j] + 1);
            }
            
            // 以n-1为起点,i为左端点的最长上升
            ans = max(ans, g[i]);
        }
        printf("%d\n", ans);
    }
}

总结

  1. 这里写>或者<都能过,为啥?