頭條第二批筆試——最大不遞減序列的長度

直接上代碼好了

public class maxLengthNoDownSequence {

    //題目描述:小名同學觀察了一下室內的PM2.5的值,發現PM2.5以小時爲週期循環
    //即任意時刻的PM2.5的值總是和1小時前相等,
    // 若在t小時內採樣一些點,選取若干採樣的數值,
    // 能否找到一個PM2.5不曾下降的序列,序列長度最大爲多少
    //輸入:兩個整數n,t,n表示採樣點數個數,t表示詢問t小時過後的結果
    //第二行:n個數字


    //思路:就是求t時間內所有采樣點的最大不遞減序列的長度。
    //第一種:就是講n*t時間內的值都存在數組中,在計算最大不遞減序列的長度,但是這個空間複雜度大:

    //4 3
//10 3 7 5
    //第二種:就是下面這一種:三層循環,一二層循環表示:對數組進行循環10 3 7 5,超過n的進行區域操作,定位到相應位置k%n,
    //進行動態規劃的計數.

    static int []a ;
    static int n ;
    static int [] dp;
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        int t = sc.nextInt();
        a = new int[n];
        for(int i = 0;i<n;i++)
        {
            a[i] = sc.nextInt();
        }
        int maxlen = 0;
        dp = new int[n*t];
        for(int i = 0;i<t;i++)
        {
            for(int j = 0;j<n;j++)
            {
                dp[i*n+j] = 1;
                for(int k = 0;k<i*n+j;k++)
                {
                    if(a[k%n]<=a[j])  //k除以n是第幾位,應該取餘數.
                        dp[i*n+j] = Math.max(dp[i*n+j],dp[k]+1);
                }
                maxlen = Math.max(maxlen,dp[i*n+j]);
            }
        }
        System.out.println(maxlen);
//4 3
//10 3 7 5
//4

//5 3
//10 3 5 7 5
//7

        //這種方法複雜化了:將a數組擴展t倍。
        //int res = 0;
        //int [] dp = new int[n*t];
        //for(int i = 0; i < n*t; i++)
        //{
        //    dp[i] = 1;
        //    for(int j = 0; j < i; j++)
        //    {
        //        if(a[j] <= a[i])
        //            dp[i] = Math.max(dp[i],dp[j] + 1);
        //    }
        //
        //    res = Math.max(res,dp[i]);
        //}
        //System.out.println(res);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章