布尔值DP表的默认初始化[关闭]

问题描述 投票:-1回答:1

我在LeetCode.com上解决了一个问题:

给出一个仅包含正整数的非空数组,请确定该数组是否可以划分为两个子集,以使两个子集中的元素之和相等。例如,对于输入[1, 5, 11, 5],输出应为true,因为它可以划分为[1, 5, 5][11]

as:

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表的方式。

我想创建一个DP表来缓存结果,并用-1对其进行初始化。对于返回false的递归调用,我利用了false映射到0并存储0的C ++属性。同样,对于返回true的递归调用,我存储一个1。本质上,我使用3个值来区分默认值和递归调用返回的两个值。这解决了目的,但我不认为这是做到这一点的粗略方法。

有人可以指出我如何以合法方式做到吗?

谢谢!

Edit

:我认为这个问题很简单-我不想在将结果存储在DP数组中时将类型转换int转换为boolean,因为类型转换的“功能”可能不会在许多其他编程语言中可供我使用。

我在LeetCode.com上解决了一个问题:给定一个仅包含正整数的非空数组,请确定该数组是否可以划分为两个子集,以便两个子集中的元素之和...

c++ algorithm dynamic-programming memoization
1个回答
0
投票

您可以使用std::optional避开vector<vector<int>>

© www.soinside.com 2019 - 2024. All rights reserved.