8.15 著名问题---最长递增子序列的长度 以及 小结

本文介绍了如何使用Java编程解决求解数组中最长递增子序列的问题,提供了暴力法和动态规划两种不同的解法。暴力法通过遍历数组,找到每个元素后面的递增序列长度;动态规划则利用dp数组记录以每个元素结尾的最长递增子序列长度,最终得到整个数组的最长递增子序列。这两种方法分别展示了不同的算法思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解法一:暴力法


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
 /* 
  * 思路:暴力法 
  * 依次将数组中的元素作为开头,寻找第一个比其大的元素i1,再从i1开始向后查找第一个比其大的...,直到查完所有元素
  输入数据:4 2 3 1 5
  * */ 
	public static void main(String[] args) {
		//(1)输入相关数据
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] a = new int[n];
		for(int i=0;i<n;i++) {
			a[i]=sc.nextInt();
		}
		int ans = f(a);
		System.out.println(ans);
	}

   private static int f(int[] a) {
	   int max=0;
	   for(int i=0;i<a.length;i++) {
		   int p=i;
		   int cnt=1;
		   for(int j=i+1;j<a.length;j++) {
			   if(a[j]>a[p]) {
				   cnt++;
				   p=j;
			   }
		   }//for
		   if(cnt>max) {
			   max=cnt;
		   }
	   }
	
	   return max;
   }

	
}

 

解法二:dp动态规划


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
 /* 
  * 思路:动态规划
  输入数据:4 2 3 1 5
  * */ 
	static int[] dp;//dp[i]:存放以i个元素结尾的序列中,最长的递增子序列(下标从0开始)
	public static void main(String[] args) {
		//(1)输入相关数据
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] a = new int[n];
		for(int i=0;i<n;i++) {
			a[i]=sc.nextInt();
		}
		//(2)获取dp表
		dp = new int[n];
		dp[0]=1;
		for(int i=1;i<n;i++) {//以第i个元素作为结尾
			int max=1;//初始最长递增子序列长度为1(ai本身)
			for(int j=i-1;j>=0;j--) {//ai前的元素aj依次与ai进行比较
				if(a[j]<a[i]) {//该元素比ai小
					max = Math.max(max, dp[j]+1);
				}
			}//for
			dp[i]=max;
		}

		System.out.println(dp[n-1]);
	}
	
}

小结:

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值