头条第二批笔试——最大不递减序列的长度

直接上代码好了

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);
}

猜你喜欢

转载自blog.csdn.net/qq_33915826/article/details/82291582