力扣每日一题:可被三整除的最大和

给你一个整数数组 nums,请你找出并返回能被三整除的元素 最大和

思路:

最开始考虑的是用01背包问题,对每个元素动态取舍,最后找到最大值。但感觉用数组一直存,可能会爆炸,因为和可能会很大。

因此选择动态递归的方式,找到取前i个和取前i+1个元素的关系。

会发现:假如现在对于前i个元素,可以被三除余j,则对于第i个元素x,如果取了,那么要在前i-1个元素中,找到被三除余j-x。如果不取,就是在前i-1个元素中找到被三除余j。因此可以得到关系式,然后用这个关系求解即可。

然后要考虑的是边界条件,就是当i<0的情况,此时对于前-1个元素,无疑只能找除3余0的,余1和余2均是不存在,因此设定余1余2都是负无穷,这样就不会取到了。

复制代码
class Solution {
public:
    int maxSumDivThree(vector<int>& nums) {
        const int n=nums.size();
        int memo[n][3];
        memset(memo,-1,sizeof(memo));
        auto dfs=[&](auto &&dfs,int i,int j)->int{
        if(i<0)return j?INT_MIN:0;
        int &res=memo[i][j];
        if(res!=-1)return res;
        return res=max(dfs(dfs,i-1,j),dfs(dfs,i-1,(dfs,j+nums[i])%3)+nums[i]);
        };

        return dfs(dfs,n-1,0);
    }
};
相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
m0_547486661 天前
《数据结构教程》全套 PPT课件2026
数据结构
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark2 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her12 天前
并查集-听课笔记
笔记·算法·并查集
码流子2 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark2 天前
从算法设计模式看编程思维的抽象能力4
算法