直接上代碼好了
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);
}