ACM入门题-最长递增子序列(LIS)-Go语言
问题描述
输入一个数组 nums ,输出其最长子数组的长度。
如:输入nums = [10,9,2,5,3,7,21,18] , 输出 4 。解释 [2,3,7,21]

本题可以使用动态规划,dp[i] 代表以nums[i] 结束的最长子序列长度。从中找到最大的 dp[i]
func lengthOfLIS(nums []int) int {
//base case
n := len(nums)
dp := make([]int,n)
res := 1
for i := 0; i < n; i++ {
dp[i] = 1
for j := 0; j < i; j++ {
if nums[j] < nums[i] {
dp[i] = max(dp[i],dp[j] + 1)
}
}
res = max(res,dp[i])
}
return res
}
func max(a,b int) int {
if a > b {return a}
return b
}
ACM入门题Super Jumping! Jumping! Jumping!
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
var sline string
sca := bufio.NewScanner(os.Stdin)
lineNums := make([][]int, 0)
var getNums = func(s []string) []int {
n := len(s)
ans := make([]int, n-1)
for i := 1; i < n; i++ {
ans[i-1], _ = strconv.Atoi(s[i])
}
return ans
}
for sca.Scan() {
sline = sca.Text()
if sline == "0" {
break
}
a := getNums(strings.Split(sline, " "))
lineNums = append(lineNums, a)
}
var max = func(a, b int) int {
if a > b {
return a
}
return b
}
for line := 0; line < len(lineNums); line++ {
a := lineNums[line]
n := len(a)
dp := make([]int, n) // dp[i] 表示以a[i]结束的最长递增子序列个数
res := 0
for i := 0; i < n; i++ {
dp[i] = a[i]
for j := 0; j < i; j++ {
if a[i] > a[j] {
dp[i] = max(dp[i], dp[j]+a[i])
}
}
res = max(res, dp[i])
}
fmt.Println(res)
}
}

这篇博客介绍了如何使用Go语言解决两个算法问题:最长递增子序列(LIS)和超级跳跃游戏。对于LIS问题,博主提供了动态规划的解决方案,通过维护以每个元素结尾的最长递增子序列长度来找到全局最长子序列。而在超级跳跃游戏中,同样运用动态规划策略更新每个位置的最大跳跃距离。代码中详细展示了这两个问题的解决过程。
938

被折叠的 条评论
为什么被折叠?



