Tianchi Online Programming 2020 National Day Eight Days Music-6。バレーシーケンス(DP)

記事ディレクトリ

1.タイトル

https://tianchi.aliyun.com/oj/118289365933779217/122647324212270018
説明:

あなたの長さのシーケンスを与えるnは、彼の中でシーケンスあなたが見つけるように谷のシーケンス、シーケンスの谷は次のように定義されています。

  • シーケンスの長さは偶数です。
  • サブシーケンスの長さが2nであると仮定します。次に、最初のn個の数値は厳密に減少し、最後のn個の数値は厳密に増加します。最初の段落の最後の要素は、このシーケンスの最小値でもある2番目の段落の最初の要素と同じです。

ここで、すべてのサブシーケンスの中でバレーシーケンスルール満たす最長の長さを見つけほしいですか?

示例
样例  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.問題解決

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(n 2)O(n ^ 2)O n2


私のCSDNブログアドレスhttps://michael.blog.csdn.net/

QRコードを長押しまたはスキャンして、私の公式アカウント(Michael Amin)をフォローし、一緒に来て、学び、一緒に進歩してください!
マイケルアミン

おすすめ

転載: blog.csdn.net/qq_21201267/article/details/108895314