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

给你一个整数数组 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);
    }
};
相关推荐
nm_zfyjt1 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
w_zero_one2 小时前
算法--构造
java·数据结构·算法
其实防守也摸鱼3 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php
小超人诞生日记4 小时前
C++ 智能指针的使用及其原理详解
c++·算法
lisw056 小时前
互联网上的数据结构可视化!
数据结构·信息可视化
AiNightVision7 小时前
无人机夜视模块如何选择?——从参数指标到系统集成的完整选型指南
人工智能·算法·计算机视觉·车载系统·无人机·视频·智能硬件
牧羊人.3338 小时前
卷积神经网络之VGG
人工智能·深度学习·神经网络·算法·cnn
小郎君6589 小时前
Vue 多标签页的加载态设计:为什么我没有用 Suspense 实现 PageLoading
vue.js·算法
JJJennie7779 小时前
MAI Gateway私有化部署全攻略:大模型网关如何接入?附架构图
算法·gateway·ai网关·魔芋ai