我在LeetCode.com上解决了一个问题:
给出一个仅包含正整数的非空数组,请确定该数组是否可以划分为两个子集,以使两个子集中的元素之和相等。例如,对于输入
[1, 5, 11, 5]
,输出应为true
,因为它可以划分为[1, 5, 5]
和[11]
。as:
是正确的。但是,我不喜欢上述初始化DP表的方式。class Solution { public: int finalSum=0; vector<int> n; bool helper(vector<vector<int>>& dp, int startIndex, int ps1, int ps2) { if(ps1==ps2 && ps1==finalSum) return true; if(startIndex>=n.size() || ps1>finalSum || ps2>finalSum) return false; if(dp[ps1][ps2]!=-1) return dp[ps1][ps2]; return dp[ps1][ps2]=helper(dp, startIndex+1, ps1+n[startIndex], ps2) || helper(dp, startIndex+1, ps1, ps2+n[startIndex]); } bool canPartition(vector<int>& nums) { int totalSum=accumulate(nums.begin(), nums.end(), 0); if(totalSum%2!=0) return false; finalSum=totalSum/2; n=nums; vector<vector<int>> dp(finalSum+1, vector<int>(finalSum+1, -1)); //this is awful return helper(dp, 0, 0, 0); } };
此代码通过了法官的预测试,这意味着该代码逻辑上
我想创建一个DP表来缓存结果,并用-1
对其进行初始化。对于返回false
的递归调用,我利用了false
映射到0
并存储0
的C ++属性。同样,对于返回true
的递归调用,我存储一个1
。本质上,我使用3个值来区分默认值和递归调用返回的两个值。这解决了目的,但我不认为这是做到这一点的粗略方法。
有人可以指出我如何以合法方式做到吗?
谢谢!
Edit
:我认为这个问题很简单-我不想在将结果存储在DP数组中时将类型转换int
转换为boolean
,因为类型转换的“功能”可能不会在许多其他编程语言中可供我使用。 我在LeetCode.com上解决了一个问题:给定一个仅包含正整数的非空数组,请确定该数组是否可以划分为两个子集,以便两个子集中的元素之和...
您可以使用std::optional
避开vector<vector<int>>
: