经典算法之动态规划

 

动态规划:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解; 对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。 适合用动态规划来解决的问题,都具有下面三个特点:最优化原理、无后效性、有重叠子问题。

经典题:斐波那契数列最长回文子串连续子数组的最大和最长递增子序列最小路径和

斐波那契数列



func fib(n int) int {
    if n <2{
        return n
    }
    var res0,res1 = 0,1
    for i:=2;i<=n;i++{
        var res = res0 +res1
        if res >= 1000000007{
            res = res %1000000007
        }
        res0 = res1
        res1 = res
        
    }
    return res1
}

求最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

思路:如果一个回文子串的起始和末尾元素相同,那么也是一个回文子串,

func longestPalindrome(s string) string {
	if len(s) < 2 {
		return s
	}
	var (
		lp     string = s[0:1]
		length        = len(s)
	)
	for index, _ := range s {
		if index+1 < length && s[index] == s[index+1] {
			for left, right := index, index+1; left >= 0 && right < length && isPalindrome(s[left:right+1]); {
				if len(s[left:right+1]) > len(lp) {
					lp = s[left : right+1]
				}
				left--
				right++
			}
		}
		for left, right := index-1, index+1; left >= 0 && right < length && isPalindrome(s[left:right+1]); {
			if len(s[left:right+1]) > len(lp) {
				lp = s[left : right+1]
			}
			left--
			right++
		}

	}
	return lp
}

func isPalindrome(s string)bool{
	if len(s ) == 1{
		return true
	}
	if s[0] == s[len(s)-1]{
		return true
	}
	return false
}

连续数组的最大和

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

思路:如果当前连续和还没有当前元素大,就舍弃之前的连续和

func maxSubArray(nums []int) int {
	if len(nums) == 0{
		return 0
	}else if len(nums) == 1{
		return nums[0]
	}
	var (
		curMul = nums[0]
		maxMul = nums[0]
	)
	for _ , n := range nums[1:]{
		curMul += n
		if curMul < n{
			curMul = n
		}
		if curMul > maxMul{
			maxMul = curMul
		}
	}
	return maxMul
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值