列1描述:
设有由n(1≤n≤200)n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)b(1)、b(2)、……、b(n)若存在i1<i2<i3<…<iei1<i2<i3<…<ie 且有b(i1)<=b(i2)<=…<=b(ie)b(i1)<=b(i2)<=…<=b(ie)则称为长度为e的不下降序列。程序要求,当原数列出之后,求出最长的不下降序列。
【输入样例】
14
13 7 9 16 38 24 37 18 44 19 21 22 63 15
import java.util.Scanner;
public class 求最长不下降序列 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int a[]=new int[100];
int f[]=new int [100];
for (int i=1;i<=n;i++){
a[i]=scanner.nextInt();
}
for(int i = 1;i <= n;i++)//初始化数组dp【】,每个数字自身组成为一个递增序列
{
f[i]=1;
}
int ant=0;
for (int i=2;i<=n;i++){//从第二个数开始
for (int j=1;j<i;j++){//第i个数与i前面的数进行比较
if(a[j]<a[i])//如果前面的数小于后面的第i个数
f[i]=Math.max(f[i],f[j]+1);//f[i]是选择前面的小的数的递增序列数加+1
//选择f[i]与f[j]+1更大的是因为有可能f[j]是前面重复的数,重复的数字不计入其中
//重复的数的有的递增序列数有有一般小于现在f【i】的数
//比如前面有两个2
}
ant=Math.max(ant,f[i]);
}
for (int z=1;z<=n;z++){
System.out.print(f[z]);
System.out.print(" ");
}
System.out.println(" ");
System.out.println(ant);
}
}
递减的代码
for (int i=2;i<=n;i++){//最后一个,作为比较数
for (int j=1;j<i;j++){//遍历i前的所有数进行比较,j是被遍历的数
if(a[i]<a[j]){//递减
//前面的大于后面的
down[i]= Math.max(down[i],down[j]+1);
//down[i]是for(j)前面选出加的
// down[j]+1是前一个数【j】的递减数
}
}
max=Math.max(max,down[i]);//选择递减数列多的
}