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

给你一个整数数组 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);
    }
};
相关推荐
_不会dp不改名_42 分钟前
leetcode3875_构造奇偶一致的数组 I
leetcode
dtq04242 小时前
数据结构 - 线性表 - 双向链表
c语言·数据结构·学习
不正经学生5 小时前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
毕竟是shy哥8 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲8 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
圣保罗的大教堂9 小时前
leetcode 1406. 石子游戏 III 困难
leetcode
晊晌_h9 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦10 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考10 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客11 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵