其他分享
首页 > 其他分享> > 动态规划4题

动态规划4题

作者:互联网

53. 最大子数组和

步骤

为了避免修改原切片元素,通过sums来保存原nums。
遍历sums,如果前继元素>0,那么当前值加上它,尝试更新最大值。
sums[i]表示以当前元素结尾的最大连续和。

GO代码

func maxSubArray(nums []int) int {
	sums := make([]int, 0, len(nums))
	for i := 0; i < len(nums); i++ {
		sums = append(sums, nums[i])
	}

	res := sums[0]
	for i := 1; i < len(sums); i++ {
		if sums[i-1] > 0 {
			sums[i] += sums[i-1]
		}

		if sums[i] > res {
			res = sums[i]
		}
	}

	return res
}

62. 不同路径

步骤

针对每个位置,由当前位置的上面或者左边移动过来,走到当前位置的路径数量是走到上面位置的路径数量与走到左边位置的路径数量之和。

GO代码

func uniquePaths(m int, n int) int {
	dp := make([][]int, m)
	for i := 0; i < m; i++ {
		dp[i] = make([]int, n)
	}

	for i := 0; i < m; i++ {
		dp[i][0] = 1
	}
	for i := 0; i < n; i++ {
		dp[0][i] = 1
	}

	for i := 1; i < m; i++ {
		for j := 1; j < n; j++ {
			dp[i][j] = dp[i-1][j] + dp[i][j-1]
		}
	}

	return dp[m-1][n-1]
}

70. 爬楼梯

步骤

爬到第1个阶梯方法数是1,爬到第2个阶梯方法数是2。
后面的阶梯方法数是前面2个阶梯方法数之和。

GO代码

func climbStairs(n int) int {
	if n <= 2 {
		return n
	}

	a := 1
	b := 2
	for i := 3; i <= n; i++ {
		c := a + b
		a = b
		b = c
	}

	return b
}

300. 最长递增子序列

步骤

dp[i]表示以当前元素结尾的最长递增子序列长度,初始值是1。
遍历当前元素时,遍历前面的元素,看是否符合严格递增,更新dp值。
dp值最大者是结果。

GO代码

func lengthOfLIS(nums []int) int {
	dp := make([]int, len(nums))
	for i := 0; i < len(nums); i++ {
		dp[i] = 1
	}

	max := dp[0]
	for i := 1; i < len(nums); i++ {
		for j := 0; j < i; j++ {
			if nums[i] > nums[j] && dp[i] < dp[j] + 1 {
				dp[i] = dp[j] + 1
			}
		}

		if dp[i] > max {
			max = dp[i]
		}
	}

	return max
}

 

标签:nums,int,sums,len,++,动态,规划,dp
来源: https://www.cnblogs.com/WJQ2017/p/16024363.html