微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

奇怪的 CPP 行为

如何解决奇怪的 CPP 行为

代码 1

#define vi vector<int>
#define vvi vector<vi>
#define vvvi vector<vvi>

int LASLengthRecur(vvvi &dp,vi &nums,int idx,int prevIdx,bool isAsc){
    if(idx == nums.size())  return 0;
    if(dp[idx][prevIdx + 1][isAsc? 1: 0] != -1)
        return dp[idx][prevIdx + 1][isAsc? 1: 0];

    int l1 = 0;
    if(isAsc){
        if(prevIdx == -1 || nums[prevIdx] < nums[idx])
            l1 = 1 + LASLengthRecur(dp,nums,idx+1,idx,!isAsc);
    
    }else if(prevIdx == -1 || nums[prevIdx] > nums[idx])
        l1 = 1 + LASLengthRecur(dp,!isAsc);

    // Skip the number
    int l2 = LASLengthRecur(dp,prevIdx,isAsc);
    
    dp[idx][prevIdx + 1][isAsc? 1: 0] = max(l1,l2);
    return dp[idx][prevIdx + 1][isAsc? 1: 0];
}


int LASLengthI(vi nums){
    
    vvvi dp1(nums.size(),vvi(nums.size(),vi(2,-1)));
    vvvi dp2(nums.size(),-1)));
    return max(LASLengthRecur(dp1,-1,0),LASLengthRecur(dp2,1));
}

代码 2

int LASLengthRecur(vvvi &dp,bool isAsc){
    if(idx == nums.size())  return 0;
    if(dp[idx][prevIdx + 1][isAsc? 1: 0] != -1)
        return dp[idx][prevIdx + 1][isAsc? 1: 0];

    int l1 = 0;
    if(isAsc && (prevIdx == -1 || nums[prevIdx] < nums[idx]))
         l1 = 1 + LASLengthRecur(dp,!isAsc);

    else if(prevIdx == -1 || nums[prevIdx] > nums[idx])
        l1 = 1 + LASLengthRecur(dp,isAsc);

    dp[idx][prevIdx + 1][isAsc? 1: 0] = max(l1,l2);
    return dp[idx][prevIdx + 1][isAsc? 1: 0];
}

CODE 1 确实给出了正确的结果,但 CODE 2 没有给出正确的结果。 对于输入 {1,2,3,4},正确的输出是 2。 对于相同的输入,CODE 2 给出 4。 CODE 1 和 CODE 2 之间有什么具体区别吗?

解决方法

// CODE1
if (a) {
    if (b) { ... }
} else if (c) { ... }

// CODE2
if (a && b) { ... } 
else if (c) { ... }

CODE1 和 CODE2 的语义不同。在第一种情况下,如果 (a) 为假,则可以执行 else if (c) {},在第二种情况下,如果 (a && b) 为假,则可以执行 else if (c)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。