1262. 可被3整除的最大和

该博客介绍了如何使用动态规划解决一个寻找数组中使得和可被三整除的最大子数组和的问题。代码以C++实现,通过创建一个三维dp数组来存储状态,根据数组元素模3的余数更新dp状态,最终返回dp数组的特定值。博客强调了状态转移方程和初始化的重要性。
摘要由CSDN通过智能技术生成

参考了这篇文章写的,感觉讲的挺清晰的。我自己有些细节还是没处理好,比如是i-1还是i这种。dp的题目除了要解决状态转移方程,初始化是最头疼的,比如这题dp[0][0]=0, 后面2个都是INT_MIN就很不容易想到。

cpp实现:

/*
 * @lc app=leetcode.cn id=1262 lang=cpp
 *
 * [1262] 可被三整除的最大和
 */
#include<iostream>
#include<vector>
using namespace std;

// @lc code=start
class Solution {
public:
    int maxSumDivThree(vector<int>& nums) {
        // 状态转移方程:dp[i][*] = max(dp[i-1][*],dp[i-1][**]+nums[i])
        int numslen = nums.size();
        // 开数组
        int dp[100000][3];
        // dp[i][0]:当前最大和模3余0
        // dp数组初始化
        dp[0][0] = 0, dp[0][1] = INT_MIN, dp[0][2] = INT_MIN;

        for (int i=1; i<numslen+1; i++){
            if (nums[i-1]%3==0){
                dp[i][0] = max(dp[i-1][0],dp[i-1][0]+nums[i-1]);
                dp[i][1] = max(dp[i-1][1],dp[i-1][1]+nums[i-1]);
                dp[i][2] = max(dp[i-1][2],dp[i-1][2]+nums[i-1]);
            }
            else if (nums[i-1]%3==1){
                dp[i][0] = max(dp[i-1][0],dp[i-1][2]+nums[i-1]);
                dp[i][1] = max(dp[i-1][1],dp[i-1][0]+nums[i-1]);
                dp[i][2] = max(dp[i-1][2],dp[i-1][1]+nums[i-1]);
            }
            else if (nums[i-1]%3==2){
                dp[i][0] = max(dp[i-1][0],dp[i-1][1]+nums[i-1]);
                dp[i][1] = max(dp[i-1][1],dp[i-1][2]+nums[i-1]);
                dp[i][2] = max(dp[i-1][2],dp[i-1][0]+nums[i-1]);
            }
        }
        return dp[numslen][0];
    }
};
// @lc code=end
int main(){
    //test
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值