0
点赞
收藏
分享

微信扫一扫

从一串数字中求其最长递增或递减序列java

爱做梦的夏夏 2022-03-30 阅读 44

列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]);//选择递减数列多的
    }
举报

相关推荐

0 条评论