题目:
给你一个整数数组 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
}