本文主要是介绍【动态规划】673. 最长递增子序列的个数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
673. 最长递增子序列的个数
解题思路
- 本题改造最长递增子序列
- 但是最长子序列的长度不止一个
- dp数组代表以nums[i]结尾的最长子序列长度
- count[i]代表以nums[i]结尾的最长子序列的个数
- 那么当nums[i]大于前面的元素nums[j]的时候,计算dp[i]和dp[j] + 1的大小,如果dp[i]更大,那么说明找到一个更长的子序列 更新count
- 如果两者相等,count[i] += count[j] 说明出现同样长度的子序列
class Solution {public int findNumberOfLIS(int[] nums) {// 和零钱问题一样 求解满足条件的子问题的个数int n = nums.length;if(n == 1){return 1;}int[] dp = new int[n];int[] count = new int[n];Arrays.fill(dp,1);Arrays.fill(count,1);int maxLength = 0;for(int i = 1; i < n; i++){for(int j = 0; j < i; j++){if(nums[i] > nums[j]){// 遍历前面的所有元素 找到一个元素比他小if(dp[j] + 1 > dp[i]){// 说明找到一个更长的递增序列dp[i] = dp[j] + 1;count[i] = count[j];}else if(dp[j] + 1 == dp[i]){count[i] += count[j];// 说明出现同样长度的最长子序列}}}maxLength = Math.max(maxLength,dp[i]);}int res = 0;for(int i = 0; i < n; i++){if(dp[i] == maxLength){res +=count[i];}}return res;}
}
这篇关于【动态规划】673. 最长递增子序列的个数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!