leetcode-1262.可被三整除的最大和(c语言)

int maxSumDivThree(int* nums, int numsSize){
    int dp[numsSize][3];
    dp[0][0]=0;
    dp[0][1]=0;
    dp[0][2]=0;
    if(nums[0]%3==0)
        dp[0][0]=nums[0];
    if(nums[0]%3==1)
        dp[0][1]=nums[0];
    if(nums[0]%3==2)
        dp[0][2]=nums[0];//赋初值
    for(int i=1;i<numsSize;i++){
        int t0=dp[i-1][0]+nums[i];
        int t1=dp[i-1][1]+nums[i];
        int t2=dp[i-1][2]+nums[i];
        for(int j=0;j<3;j++){//给dp[i][j]赋值
            int t=0;
            if(t0%3==j){
                t=findmax(t,t0);
            }
            if(t1%3==j){
                 t=findmax(t,t1);
            }
            if(t2%3==j){
                 t=findmax(t,t2);
            }//找出符合条件且最大的t1,t2,t3
            dp[i][j]=findmax(dp[i-1][j],t);//将t与前一项比较
        }
    }
    return dp[numsSize-1][0];
}
//比较大小函数
int findmax(int a,int b){
    if(a>b)
        return a;
    else
        return b;
}
方法:动态规划

思路:设置数组dp[i][j],所代表的意思是0-i位数除以3得j的最大和。例如dp[3][1]为前4位除以3余1的最大和。(其中0<=j<=2)

设 t0=dp[i-1][0]+nums[i];
t1=dp[i-1][1]+nums[i];
t2=dp[i-1][2]+nums[i];

dp[i][j]共有四种可能的取值:
1.如果t0,t1,t2取余3都不等于j,则为dp[i-1][j]
2.如果t0%3j,则可能为t0
3.如果t1%3
j,则可能为t1
4.如果t2%3==j,则可能为t2
取所有可能的值的最大值就是dp[i][j]的值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值