bobo老师,在做leetcode1262号问题时,也想尝试用记忆化搜索来解决,但是没想出来递归的状态转移,后来我用一维dp做了一下,就是维护一个dp[3]的状态,每次根据当前数字+上一次的dp结果和3取余,然后根据余数更新dp[3]中的不同位置,这样返回递推如下:
int myMax(int a, int b){
return a > b ? a : b;
}
int maxSumDivThree(int* nums, int numsSize){
int tmp[3] = {0, 0, 0};
int res[3] = {0, 0, 0};
for(int i = 0; i < numsSize; ++i){
for(int j = 0; j < 3; ++j){
if((nums[i] + res[j]) % 3 == 0)
tmp[0] = myMax(tmp[0], nums[i] + res[j]);
else if((nums[i] + res[j]) % 3 == 1)
tmp[1] = myMax(tmp[1], nums[i] + res[j]);
else if((nums[i] + res[j]) % 3 == 2)
tmp[2] = myMax(tmp[2], nums[i] + res[j]);
}
memcpy(res, tmp, sizeof(int) * 3);
}
return res[0];
}
我想通过这个再反推一下递归方式的记忆化搜索,但是还是没有想出来,望bobo老师指点一下记忆化搜索的思路,我大概想了一下是不是记忆化搜索需要用memo[i][mod]这样的方式来记录记忆化搜索结果?感觉这应该是一个类似0-1背包思路的问题,但是始终没绕出来