文章目录
动态规划之子序列连续问题
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
}

