1262. 可被三整除的最大和

35 阅读1分钟

题目:
给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。
算法:
方法一:动态规划 (求余转移) 能被3整除是关键提示点。所有的原始之和对3求余有0,1,2三种可能。
每次遍历到一个数,可以选择选择或者不选择当前数nums[i],状态转移方程: dp[i][0] = max(dp[i - 1][0] + nums[i])
dp[i][1] = max(dp[i - 1][1] + nums[i])
dp[i][2] = max(dp[i - 1][2] + nums[i])
最后dp[i][0]就是答案。

func maxSumDivThree(nums []int) int {
    dp := make([]int, 3)
    dp2 := make([]int, 3)
    for i := range nums {
        for j := range dp {
            m := (nums[i] + dp[j])
            dp2[m % 3] = max(dp2[m % 3], m)
        }
        copy(dp, dp2)
    }
    return dp[0]
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}