题目:给你一个整数数组 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 数组即可,注意一点,更新的时候要保存上一个状态的值,避免后续更新的时候重复影响。

  

 #include <iostream>
#include <vector>
#include <algorithm>
using namespace std; int maxSumDivThree(vector<int>& nums) {
int dp[] = { , , };
int i;
cout << "┌───────┬───────┬───────┐" << endl;
for (i = ; i < nums.size(); i++)
{
//依次判断nums[i]
int mod = nums[i] % ;
int a = dp[( + - mod) % ];//保留上一步的值,避免后续相加影响
int b = dp[( + - mod) % ];
int c = dp[( + - mod) % ]; if (a||mod == ) dp[] = max(dp[], a + nums[i]);
if (b||mod == ) dp[] = max(dp[], b + nums[i]);
if (c||mod == ) dp[] = max(dp[], c + nums[i]);
cout << "│\t" << dp[] << "\t│\t" << dp[] << "\t│\t" << dp[] << "\t│" << endl;
if(i<nums.size()-)
cout << "├───────┼───────┼───────┤" << endl;
else
cout << "└───────┴───────┴───────┘" << endl;
} return dp[];
} vector<int> vc;
int main()
{
int n;
cin >> n;
vc.resize(n);
int i;
for (i = ; i < n; i++)
cin>>vc[i];
cout << endl;
cout << "能被3整除的最大和为:" <<maxSumDivThree(vc) << endl;
return ;
}

理解:(当然这是看的别人的想法,作者https://leetcode-cn.com/u/igamegum/

  先看下运行结果吧,就用上边的实例进行解释:

  

   1、a,b,c是干什么用的?

  a,b,c应该是保留上一步的值,a、b、c的取值如下:

  

  每次均记录了上一步的dp中的值,下一步在计算dp[0]时,dp[0]会发生变化,此时,在计算dp[1]时,用到的dp[0]不再是原始的dp[0],从而造成数据的不一致问题!

  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大!!!

方案二、国外神代码,没解释,等待理解

 class Solution {
public:
int maxSumDivThree(vector<int>& A) {
vector<int> dp = {, INT_MIN, INT_MIN};
for (int a : A) {
vector<int> dp2 = {, , };
for (int i = ; i < ; ++i)
dp2[(i + a) % ] = max(dp[(i + a) % ], dp[i] + a);
dp = dp2;
}
return dp[];
}
};

理解了之后回来更新~~~

Leetcode 1262. 可被三整除的最大和的更多相关文章

  1. LeetCode 5365. 可被三整除的最大和 Greatest Sum Divisible by Three

    地址 https://www.acwing.com/solution/leetcode/content/6340/ 题目描述给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和. 示例 : ...

  2. 【JavaScript】Leetcode每日一题-最大整除子集

    [JavaScript]Leetcode每日一题-最大整除子集 [题目描述] 给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对(an ...

  3. [LeetCode] 3Sum Closest 最近三数之和

    Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...

  4. LeetCode 15. 3Sum(三数之和)

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  5. LeetCode第二天&第三天

    leetcode 第二天 2017年12月27日 4.(118)Pascal's Triangle JAVA class Solution { public List<List<Integ ...

  6. [LeetCode] Self Dividing Numbers 自整除数字

    A self-dividing number is a number that is divisible by every digit it contains. For example, 128 is ...

  7. [LeetCode] 259. 3Sum Smaller 三数之和较小值

    Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 < ...

  8. 【LeetCode】15、三数之和为0

    题目等级:3Sum(Medium) 题目描述: Given an array nums of n integers, are there elements a, b, c in nums such t ...

  9. 【LeetCode】15. 3Sum 三数之和

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:3sum, 三数之和,题解,leetcode, 力扣,P ...

随机推荐

  1. java.lang.NoClassDefFoundError: javax/el/ELManager

    今天搭建一个ssm框架的项目,报了一个令我怀疑人生的错误: java.lang.NoClassDefFoundError: javax/el/ELManager 网上说出现这种错,大概有以下两个原因: ...

  2. PHP 垃圾回收机制详解

    前言:之前对PHP的GC只是了解了个大概,这次详细了解下PHP的垃圾回收机制(GC). 介于网上大部分都是PHP5.X的GC,虽然 php5 到 php7 GC部分做出的改动较小,但我觉得还是一起写下 ...

  3. docker部署angular和asp.net core组成的前后端分离项目

    最近使用docker对项目进行了改进,把步骤记录一下,顺便说明一下项目的结构. 项目是前后端分离的项目,后端使用asp.net core 2.2,采用ddd+cqrs架构的分层思想,前端使用的是ang ...

  4. Delphi中窗体的事件

    Delphi中窗体的事件 Form窗体可以响应各种各样的时间,在Object Inspector的Events页面中罗列了一大堆,如下图: 下面将要列出一些常用的事件. 1.OnActivate 当窗 ...

  5. python3高阶函数

    高阶函数英文叫Higher-order function. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码: >>> abs(-10) 10 ...

  6. python基础-面向对象编程之组合

    面向对象编程之组合 定义:一个对象中拥有另一个或其他多个对象的属性和方法. 作用:减少代码的冗余,降低耦合度 关于耦合度的说明 耦合:通俗地讲,就是相互作用,相互影响的意思 耦合度越高,程序的可扩展性 ...

  7. SQOOP的使用方法

    Sqoop是个命令行工具,用来在Hadoop和rdbms之间传输数据. 以Hadoop的角度看待数据流向,从rdbms往Hadoop是导入用sqoop import命令,反之从hadoop往rdbms ...

  8. Jenkins+GitLab+Ansible-playbook的环境安装(yum)

    1.安装GitLab 1.1 配置gitlab的yum源 # 参考:https://packages.gitlab.com/gitlab/gitlab-ce/install#bash-rpm curl ...

  9. Python从零开始——解释器

  10. idea 2019 集成activiti, idea activiti 新建bpmn文件, 解决idea activiti中文乱码

    idea 在线安装activiti插件 1. File-->Settings 2. 点击Plugins, 右侧界面点击Marketplace后在搜索框搜索 actiBPM 注: 网络原因没有加载 ...