带权活动安排问题,求最大价值和对应的行动
n个活动,有起始时间和价值,时间不冲突的情况下的最大价值和对应的策略,
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
arr := [][]int{
{1, 4, 5},
{3, 5, 1},
{0, 6, 8},
{4, 7, 4},
{3, 8, 6},
{5, 9, 3},
{6, 10, 2},
{8, 11, 4},
}
sort.Slice(arr, func(i, j int) bool {
if arr[i][1] == arr[j][1] {
return arr[i][0] < arr[j][0]
}
return arr[i][1] < arr[j][1]
})
n := len(arr)
dp := make([]int, n+1)
choose := make([]int, n+1)
prev := make([]int, n+1)
for i := 1; i <= n; i++ {
dp[i] = max(dp[i-1], arr[i-1][2])
if dp[i-1] <= arr[i-1][2] {
choose[i] = 1
}
for j := 1; j < i; j++ {
if arr[j-1][1] > arr[i-1][0] {
break
} else {
if dp[i] < max(dp[i], dp[j]+arr[i-1][2]) {
dp[i] = max(dp[i], dp[j]+arr[i-1][2])
choose[i] = 1
prev[i] = j
}
}
}
}
cur := n
for ; choose[cur] != 1; cur-- {
}
track := make([]string, 0)
for {
track = append([]string{strconv.Itoa(cur)}, track...)
cur = prev[cur]
if cur == 0 {
break
}
}
ans := strings.Join(track, " ")
fmt.Printf("%2v\n", dp) //[ 0 5 5 8 9 9 9 10 13]
fmt.Printf("%2v\n", choose) //[ 0 1 0 1 1 0 0 1 1]
fmt.Printf("%2v\n", prev) //[ 0 0 0 0 1 0 0 3 4]
fmt.Println(ans) //1 4 8
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具