代码
class Solution {
public int findNumberOfLIS(int[] nums) {
int n=nums.length;
int[] dp=new int[n];//以i为结尾的最长递增子序列的长度
int[] cnt=new int[n];//以i为结尾的最长递增子序列的个数
int res=0;//结果个数
int maxLen=0;//最长递增子序列的长度
for(int i=0;i<n;i++){
dp[i]=1;
cnt[i]=1;
for(int j=0;j<i;j++){//j的范围是啥
if(nums[j]<nums[i]){//nums[i]比nums[j]大,才能以nums[i]结尾
if(dp[j]+1>dp[i]){//以j为结尾的子序列在结尾添加i后,序列长度变长
dp[i]=dp[j]+1;//i为结尾的子序列长度 由 j为结尾的子序列长度转移得到
cnt[i]=cnt[j];
}
else if(dp[j]+1==dp[i]){//以j为结尾的子序列在结尾添加i后,序列长度不变
cnt[i]+=cnt[j];//以i为结尾的个数 由 以j为结尾的个数 转移得到
}
}
}
if(dp[i]>maxLen){//如果i的序列大于当前最长序列
maxLen=dp[i];//将最长序列设置为以i结尾的
res=cnt[i];//将最长序列个数设置为以i结尾的个数
}
else if(dp[i]==maxLen){//如果长度相等
res+=cnt[i];//最长序列个数 加上 以I为结尾的个数
}
}
return res;
}
}