天池在线编程 2020国庆八天乐 - 6. 山谷序列(DP)

2021-02-19 15:33:01 浏览数 (1)

1. 题目

https://tianchi.aliyun.com/oj/118289365933779217/122647324212270018 描述:

给你一个长度为 n 的序列,在他的子序列中让你找一个山谷序列,山谷序列定义为:

  • 序列的长度为偶数。
  • 假设子序列的长度为 2n 。则前 n 个数是严格递减的,后 n 个数是严格递增的,并且第一段的最后一个元素和第二段的第一个元素相同,也是这段序列中的最小值。

现在想让你找所有子序列中满足山谷序列规则的最长的长度为多少?

代码语言:javascript复制
示例
样例  1:
    输入: num = [5,4,3,2,1,2,3,4,5]
    输出: 8
    样例解释: 
    最长山谷序列为[5,4,3,2,2,3,4,5]

样例 2:
    输入:  num = [1,2,3,4,5]
    输出: 0
    样例解释: 
    不存在山谷序列

2. 解题

代码语言:javascript复制
class Solution {
public:
    /**
     * @param num: sequence
     * @return: The longest valley sequence
     */
    int valley(vector<int> &num) {
        // write your code here
        int n = num.size();
        if(n <= 1) return 0;
        vector<int> up(n, 1), down(n, 1);//最长递增/递减数组
        for(int i = 1, j; i < n; i  ) //正序
        {
        	for(j = 0; j < i; j  )
        	{
        		if(num[j] > num[i])//前面的比当前大,递减
        			down[i] = max(down[i], down[j]   1);
        	}
        }
        for(int i = n-2, j; i >= 0; i--) //逆序遍历
        {
        	for(j = i 1; j < n; j  )
        	{
        		if(num[j] > num[i])//后面的比当前大,递增
        			up[i] = max(up[i], up[j]   1);
        	}
        }
        int maxlen = 0;
        for(int i = 0, j; i < n; i  )
        {
        	for(j = i 1; j < n; j  )
        	{
        		if(num[i] == num[j])//最小的数
        		{
        			maxlen = max(maxlen, min(down[i],up[j])*2);
        		}						// 两侧等长的递减 递增
        	}
        }
        return maxlen;
    }
};

时间复杂度 O(n2)

dp

0 人点赞