【动态规划】673. 最长递增子序列的个数
2023-12-31 17:27:18
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;
}
}
文章来源:https://blog.csdn.net/qq_44653420/article/details/135317555
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!