该死
有些生疏了
什么时候才是头啊
这道题,采用的动态规划,而而且这道题和爬楼梯很像,或者和之前的棋子游戏?很像
题目也好理解,就是给定一个整数数组,满足数组划分成 2-2、3-3-3、1-2-3的这种格式,这个数组就存在有效划分
class Solution {
public:
bool validTwo(int num1, int num2){
return num1 == num2;
}
bool validThree(int num1, int num2, int num3){
return (num1 == num2 && num1 == num3 || num1 + 1 == num2 && num2+1== num3);
}
bool validPartition(vector<int>& nums) {
/*
将数组拆分成满足要求的子数组,如果拆分成功---> 返回true,否则,返回false
当只有两个元素,且这两个元素一样,判定成功
nums[i] == nums[i-1] && f[i-2] == true
nums[i] == nums[i-1] == nums[i-2] && f[i-3] == true
nums[i] == nums[i-1] + 1 == nums[i-2] + 2 && f[i-3] == true
*/
int n = nums.size();
std::vector<int> dp(n+1, 0);
// 边界 dp[0] == 1
dp[0] = 1;
/*
从第一个到最后一个 1--> n
*/
for(int i = 1; i < n+1; ++i){
if(i >= 2){
dp[i] = dp[i-2] && validTwo(nums[i-2], nums[i-1]);
}
if(i >= 3){
/*
dp[i] = (dp[i-3] && validThree(nums[i-3], nums[i-2], nums[i-1]));
这种是错误的,因为遗漏了一种情况,当i>=3时,可能dp[i]的值已经确定了
这种方式是通过nums[i-1] == nums[i-2]确定的
*/
dp[i] = dp[i] || (dp[i-3] && validThree(nums[i-3], nums[i-2], nums[i-1]));
}
}
return dp[n];
}
};