📅  最后修改于: 2023-12-03 14:55:23.532000             🧑  作者: Mango
最长递增子序列(Longest Increasing Subsequence)是指给定一个未排序的整数数组,找到其中最长的递增子序列的长度。下面是一个使用动态规划算法解决最长递增子序列问题的Java程序示例。
动态规划是一种常用的算法思想,用于解决最优化问题。在最长递增子序列问题中,使用动态规划算法可以通过子问题的最优解来求解原问题的最优解。
动态规划算法解决最长递增子序列问题的基本思路如下:
dp
,其中dp[i]
表示以第i
个元素结尾的最长递增子序列的长度。dp
数组为1,因为每个元素本身就构成一个长度为1的递增子序列。nums[i]
,遍历它之前的所有元素nums[j]
,如果nums[i] > nums[j]
,则更新dp[i] = Math.max(dp[i], dp[j] + 1)
。dp
数组,找到最大的元素作为最长递增子序列的长度。以下是使用Java实现的最长递增子序列程序示例:
public class LongestIncreasingSubsequence {
public static int lengthOfLIS(int[] nums) {
int n = nums.length;
int[] dp = new int[n];
Arrays.fill(dp, 1);
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
int maxLength = 0;
for (int i = 0; i < n; i++) {
maxLength = Math.max(maxLength, dp[i]);
}
return maxLength;
}
public static void main(String[] args) {
int[] nums = {10, 9, 2, 5, 3, 7, 101, 18};
int lisLength = lengthOfLIS(nums);
System.out.println("最长递增子序列的长度为:" + lisLength);
}
}
以上程序中,lengthOfLIS
方法用于计算最长递增子序列的长度。该方法通过动态规划算法,使用dp
数组记录以每个元素结尾的最长递增子序列的长度。最后,遍历dp
数组找到最大值即可得到最长递增子序列的长度。
在main
方法中,我们定义了一个整数数组nums
,并调用lengthOfLIS
方法计算最长递增子序列的长度,并输出结果。
运行程序,将会得到以下输出:
最长递增子序列的长度为:4
以上程序使用动态规划算法解决了最长递增子序列问题,并且在输出结果中返回了最长递增子序列的长度。
希望对你有帮助!