文章目录
 
 
动态规划之子序列连续问题
 
1.最长连续递增序列
 
1.1暴力解法
 
func findLengthOfLCIS(nums []int) int {
	res := 1
	for i := 0; i < len(nums); i++ {
		j := i
		for j < len(nums)-1 && nums[j] < nums[j+1] {
			j++
		}
        res = max(res, j-i+1)
	}
	return res
}
func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
 

 
1.2贪心算法
 
func findLengthOfLCIS(nums []int) int {
	res := 1
	count := 0
	for i := 0; i < len(nums)-1; i++ {
		if nums[i+1] > nums[i] {
			count++
		} else {
			count = 0
		}
		res =max(res,count+1)
	}
	return res
}
func max(a,b int)int{
	if a >b{
		return  a
	}
	return b
}
 
 
1.3动态规划
 
func findLengthOfLCIS(nums []int) int {
	n := len(nums)
	dp := make([]int, n)
	for i := 0; i < n; i++ {
		dp[i] = 1
	}
	maxLength := 1
    
	for i := 1; i < n; i++ {
		if nums[i] > nums[i-1] {
			dp[i] = dp[i-1] + 1
		}
		maxLength =max(maxLength,dp[i])
	}
	return maxLength
}
func max(a,b int)int{
	if a >b{
		return  a
	}
	return b
}
 
 

 
2.最长重复子数组
 
2.1动态规划
 
func findLength(A []int, B []int) int {
	m, n := len(A), len(B)
	res := 0
	dp := make([][]int, m+1)
	for i := 0; i <= m; i++ { 
		dp[i] = make([]int, n+1)
	}
   
	for i := 1; i <= m; i++ {
		for j := 1; j <= n; j++ {
			if A[i-1] == B[j-1] {
                
				dp[i][j] = dp[i-1][j-1] + 1
			}
			res =max(dp[i][j],res)
		}
	}
	return res
}
func max(a,b int)int{
	if a >b{
		return  a
	}
	return b
}
 
 
 
 
 
 

 

 
2.2滚动数组
 
func findLength(A []int, B []int) int {
    n, m := len(A), len(B)
    ret := 0
    for i := 0; i < n; i++ {
        len := min(m, n - i)
        maxLen := maxLength(A, B, i, 0, len)
        ret = max(ret, maxLen)
    }
    for i := 0; i < m; i++ {
        len := min(n, m - i)
        maxLen := maxLength(A, B, 0, i, len)
        ret = max(ret, maxLen)        
    }
    return ret
}
func maxLength(A, B []int, addA, addB, len int) int {
    ret, k := 0, 0
    for i := 0; i < len; i++ {
        if A[addA + i] == B[addB + i] {
            k++
        } else {
            k = 0
        }
        ret = max(ret, k)
    }
    return ret
}
func max(x, y int) int {
    if x > y {
        return x
    }
    return y
}
func min(x, y int) int {
    if x < y {
        return x
    }
    return y
}
 
 

 
 
 
 
 
3.最大子数组和(最大子序和)
 
3.1暴力求解
 
func maxSubArray(nums []int) int {
	result := math.MinInt32
	for i := 0; i < len(nums); i++ {
		count := 0
		for j := i; j < len(nums); j++ {
			count += nums[j]
			if count > result {
				result = count
			} else {
				continue
			}
		}
	}
	return result
}
 
 

 
3.2贪心算法
 
func maxSubArray(nums []int) int {
    
	result := math.MinInt32
	count := 0
	for i := 0; i < len(nums); i++ {
		count += nums[i]
        
		if count >result {
			result  =count
		}
		if count <= 0 {
			count = 0
		}
	}
	return result
}
 
 
3.3动态规划
 
func main() {
	a := []int{5, 4, -1, 7, 8}
	fmt.Println(a)              
	fmt.Println(maxSubArray(a)) 
	fmt.Println(a)              
}
func maxSubArray(nums []int) int {
    n := len(nums)
    
    dp := make([]int,n)
    
    dp[0] = nums[0]
    
    mx := nums[0]
    for i:=1;i<n;i++ {
        
        
        dp[i] = max(dp[i-1]+nums[i],nums[i])
        mx = max(mx,dp[i])
    }
    return mx
}
func max(a,b int) int{
    if a>b {
        return a 
    }
    return b
}
 
 
 

 
