題目:給你乙個整數陣列 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。示...