Leetcode 1262 可被三整除的最大和

2022-05-11 12:34:40 字數 1808 閱讀 1343

題目:給你乙個整數陣列 nums,請你找出並返回能被三整除的元素最大和。

示例 1:

輸入:nums = [3,6,5,1,8]

輸出:18

解釋:選出數字 3, 6, 1 和 8,它們的和是 18(可被 3 整除的最大和)。

這道題是第163周競賽的一道題目,難度中等,邊學別人的解題方法,邊記錄吧!

方案一、不妨設dp[i] 代表 選取的數字累加和 模3 = i 的數字和

假定nums[i] % 3 = 1 ,那麼,和 前面選取的數字和模 3 = 2 的數相加,就可以模3為 0 ,表達起來就是 dp[0] = max(dp[0], nums[i] + dp[2])

依次類推,只要不斷更新 dp 陣列即可,注意一點,更新的時候要儲存上乙個狀態的值,避免後續更新的時候重複影響。

1 #include 2 #include 3 #include 4

using

namespace

std;56

int maxsumdivthree(vector&nums) ;

8int

i;9 cout << "

┌───────┬───────┬───────┐

"<

10for (i = 0; i < nums.size(); i++)

1127

28return dp[0

];29}30

31 vectorvc;

32int

main()

33

理解:(當然這是看的別人的想法,作者先看下執行結果吧,就用上邊的例項進行解釋:

1、a,b,c是幹什麼用的?

2、if(b || mod == 1)中,為什麼還要判斷b的值?

這裡的b我理解的是,當它不為0的時候,不過mod值是不是1,我都需要去更新dp[1],因為存在mod是2,需要考慮(2+2)%3=1的情況,同樣,mod為0,需要考慮(1+0)%3=1的情況;這裡我們去掉試一試,看下結果:

顯然,當計算第4層時,數字1%3=1,此時,dp[0]只考慮了mod=0,所以dp[0]沒有進行更新,但是數字1+dp[2]也可以構成模3餘0的情況,並且和為15,顯然比9大!!!

方案

二、國外神**,沒解釋,等待理解

1

class

solution ;

5for (int

a : a) ;

7for (int i = 0; i < 3; ++i)

8 dp2[(i + a) % 3] = max(dp[(i + a) % 3], dp[i] +a);

9 dp =dp2;10}

11return dp[0

];12

}13 };

理解了之後回來更新~~~

leetcode 1262 可被三整除的最大和

一道動態規劃的題,設乙個dp陣列。有三種狀態,對0取余為0,1,2 求每個陣列元素對0取餘的值,並動態更新dp陣列。例如 0的dp陣列 取余為0的還是0 0的dp陣列 取余為1的是1 0的dp陣列 取余為2的是2.這裡有一點需要注意,即0,1,2三種情況的初始化。0的陣列可以直接初始化為0,而1和2...

1262 可被三整除的最大和

給你乙個整數陣列 nums,請你找出並返回能被三整除的元素最大和。示例 1 輸入 nums 3,6,5,1,8 輸出 18 解釋 選出數字 3,6,1 和 8,它們的和是 18 可被 3 整除的最大和 示例 2 輸入 nums 4 輸出 0 解釋 4 不能被 3 整除,所以無法選出數字,返回 0。示...

1262 可被三整除的最大和

給你乙個整數陣列 nums,請你找出並返回能被三整除的元素最大和。示例 1 輸入 nums 3,6,5,1,8 輸出 18 解釋 選出數字 3,6,1 和 8,它們的和是 18 可被 3 整除的最大和 示例 2 輸入 nums 4 輸出 0 解釋 4 不能被 3 整除,所以無法選出數字,返回 0。示...