这里的状态定义一般使用DP【i】 表示 考虑前i个东西能否满足条件,然后我们枚举上一次的转移位置就好了
需要注意的是我习惯从1开始写,所以要处理好边界的下标问题
class Solution {
public:
bool validPartition(vector<int>& nums) {
int n = nums.size();
vector<int>dp(n+10);
dp[0] = 1;
for(int i=2;i<=n;i++){
if(i-2>=0&&nums[i-1]==nums[i-2])dp[i]|=dp[i-2];
if(i-3>=0&&nums[i-1]==nums[i-2]&&nums[i-1]==nums[i-3])dp[i]|=dp[i-3];
if(i-3>=0&&nums[i-1]==nums[i-2]+1&&nums[i-1]==nums[i-3]+2)dp[i]|=dp[i-3];
}
return dp[n];
}
};
和上面的思路相同,直接搞一下就好了,在字符串s上 划分DP一下
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
int n = s.size();
int m = wordDict.size();
vector<int>dp(n+10);
dp[0] = 1;
for(int i=1;i<=n;i++){
for(int j=0;j<m;++j){
int sz = wordDict[j].size();
if(i-sz<0)continue;
string tem = s.substr(i-sz,sz);
if(tem==wordDict[j])dp[i]|=dp[i-sz];
}
}
for(int i=1;i<=n;i++)cout<<dp[i]<<" ";
return dp[n];
}
};