代码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, nums, idx+1, idx, !isAsc);
// Skip the number
int l2 = LASLengthRecur(dp, nums, idx+1, 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(), vvi(nums.size(), vi(2, -1)));
return max(LASLengthRecur(dp1, nums, 0, -1, 0),
LASLengthRecur(dp2, nums, 0, -1, 1));
}
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 && (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, nums, idx+1, idx, !isAsc);
// Skip the number
int l2 = LASLengthRecur(dp, nums, idx+1, prevIdx, isAsc);
dp[idx][prevIdx + 1][isAsc? 1: 0] = max(l1, l2);
return dp[idx][prevIdx + 1][isAsc? 1: 0];
}
代码 1 确实给出了正确的结果,但代码 2 没有给出正确的结果。 对于输入 {1, 2, 3, 4},正确的输出是 2。 对于相同的输入,代码 2 给出 4。 代码 1 和代码 2 之间有什么具体区别吗?
// CODE1
if (a) {
if (b) { ... }
} else if (c) { ... }
// CODE2
if (a && b) { ... }
else if (c) { ... }
CODE1 和 CODE2 的语义不同。在第一个 case 块中,如果 (a) 为 false,则可以执行 else if (c) {};在第二个 case 块中,如果 (a && b) 为 false,则可以执行 else if (c)。