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

72 阅读1分钟

题目:
给定一个未排序的整数数组 nums , 返回最长递增子序列的个数 。

注意 这个数列必须是 严格 递增的。
算法:
方法一:动态规划

func findNumberOfLIS(nums []int) int {
	// dp[i][j]为以nums[i]结尾的子序列的最大长度,和最大长度的序列次数
	dp := make([][]int, len(nums))
	for i := range dp {
		dp[i] = []int{1,1}
	}
	maxLength := 1
	for i := 1; i < len(nums); i ++ {
		for j := 0; j < i; j ++ {
			if nums[j] < nums[i] {
				newLength := dp[j][0] + 1
				if newLength > dp[i][0] {
					dp[i][0] = newLength 
					dp[i][1] = dp[j][1]
				} else if newLength == dp[i][0] {
					dp[i][1] = dp[i][1] + dp[j][1]
				}
			}
		}
		if dp[i][0] > maxLength {
			maxLength = dp[i][0]
		}
	}
	// fmt.Println(dp)
	ans := 0
	for i := range dp {
		if dp[i][0] == maxLength {
			ans = ans + dp[i][1]
		}
	}

	return ans
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}