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%3j,则可能为t1
4.如果t2%3==j,则可能为t2
取所有可能的值的最大值就是dp[i][j]的值。