動態規劃之5:分割型別題
阿新 • • 發佈:2020-08-29
對於分割型別的題目,動態規劃的狀態轉移方程通常不依賴於相鄰的位置,而是依賴於滿足分割條件的位置。
完全平方數
class Solution { public: int numSquares(int n) { if(n <= 0) return 0; vector<int> dp(n+1,INT_MAX); dp[0] = 0; for(int i=1;i<=n;++i) for(int j=1;j*j<=i;++j) dp[i] = min(dp[i],dp[i-j*j]+1); return dp.back(); } };
解碼方法
class Solution { public: int numDecodings(string s) { if (s.empty() || s[0] == '0') return 0; vector<int> dp(s.size()+1); dp[0]=1;dp[1]=1; for (int i =1; i < s.size(); i++) { if (s[i] == '0') { if (s[i - 1] == '1' || s[i - 1] == '2') dp[i+1] = dp[i-1]; else return 0; } else { if (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] <= '6')) dp[i+1] = dp[i]+dp[i-1]; else dp[i+1] = dp[i]; } } return dp.back(); } };
單詞拆分
class Solution { public: bool wordBreak(string s, vector<string>& wordDict) { if(s.empty()) return false; int n = s.length(); //@ 每個位置是否可以被切割 vector<bool> dp(n+1,false); dp[0] = true; for(int i=1;i<=n;++i) { for(auto& word : wordDict) { int len = word.length(); if(i >= len && s.substr(i-len,len)== word) dp[i] = dp[i] || dp[i-len]; } } return dp.back(); } };