LC.673 最长递增子序列的个数

 public int findNumberOfLIS(int[] nums) {
        //单串问题
        if(nums==null || nums.length==0){
            return 0;
        }
        int res=1;
        int Counter[]=new int[nums.length];
        Counter[0]=nums.length;

        int dp[]=new int[nums.length];
        int dpe[]=new int[nums.length];
        for(int i=0;i<nums.length;i++){
            dp[i]=1;
            dpe[i]=1;
        }
       // dp[0]=1;
        for(int i=0;i<nums.length;i++){
            int MaxLen=1;//因为对于单个元素无论如何最低都是1了
            for(int j=0;j<i;j++){//搜索前面O(n)种情况,因为他是不连续的,可以从前面的i个种作为他的上一个元素
                if(nums[i]>nums[j]){//符合递增特点
                    MaxLen=Math.max(dp[j],MaxLen);
                    if(dp[j]+1>dp[i]){
                        dp[i]=dp[j]+1;
                        dpe[i]=dpe[j];
                    }else if(dp[j]+1==dp[i]){
                        dpe[i]+=dpe[j];
                    }

                }
            }
            res=Math.max(dp[i],res);//刷新最大值
        }
        int ans=0;
        for(int i=0;i<nums.length;i++){
            if(dp[i]==res){
                ans+=dpe[i];
            }
        }
        return ans;
    }

和LC300大体思路一样,但是要统计重复字符串 重点再于维护dpe数组用于统计到达最大值时候的解法数,记得 是累计解法,也就是dpe[i]=dpe[lastA]+dpe[lastB....];
因为默认情况下最少有一种解法初始化为1,为该元素LIS长度为1时的解法。如果要更新长度了,说明原来的数据要清0
但是注意要是更新最大长度英国式dpe[i]=dpe[last]
https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/

全部评论

相关推荐

专业嗎喽:个人信息名字太大,合到电话邮箱那一栏就行,有党员写过党,剩下其他全删,站空太大了 把实习经历丰富,放最前面,然后是个人评价,技能之类的,然后是学校信息。项目经历最后面,可以就选一个自己擅长的。 现在是学校不是92就扣分的,没必要放前面。 然后现在看重实习经历>竞赛经历(校园经历)>课程项目经历
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务