20.10.10 LeetCode动态规划类
一、分割类问题
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 示例 1: 输入: n = 12 输出: 3 解释: 12 = 4 + 4 + 4. 示例 2: 输入: n = 13 输出: 2 解释: 13 = 4 + 9. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/perfect-squares 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:
一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数。 题目数据保证答案肯定是一个 32 位的整数。 示例 1: 输入:"12" 输出:2 解释:它可以解码为 "AB"(1 2)或者 "L"(12)。 示例 2: 输入:"226" 输出:3 解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。 示例 3: 输入:s = "0" 输出:0 示例 4: 输入:s = "1" 输出:1 示例 5: 输入:s = "2" 输出:1 提示: 1 <= s.length <= 100 s 只包含数字,并且可以包含前导零。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/decode-ways 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:
本题需要注意将可能出现的情况进行分类,并以不同的状态方式分别描述不同的情况,值得一提的是,博主认为该题略有些ambiguous,例如1213与12130,这两串字符串在LeetCode系统里是完全不同的,前者认为是有效信息,后者末尾0前为3,无法识别,整个字符串视为无效,解码数为0。为什么这里不能把他看作1213,0只为附加的无效信息呢?再者如1302,不能看成是ACB或者MB吗?由于歧义非常大,我点开评论一看全是喷子,我就懂了...不管怎么说,有规则就遵守,过LeetCode的题解如下:
class Solution { public: int numDecodings(string s) { //判别字符串是否符合规定与是否需要统计 int n = s.length(); if(n==0) return 0; int pre = s[0]-'0'; if(!pre) return 0; if(n==1) return 1; vector<int>dp(n+1,1); for(int i = 2;i<=n;++i) { int cur = s[i-1]-'0'; if( (pre==0||pre>2) && cur == 0 ) return 0; if( (pre<2&& pre>0) || pre==2 && cur <7) { if(cur) { dp[i] = dp[i-1]+dp[i-2]; } else { dp[i] = dp[i-2]; } } else// 以上条件无一满足,延续前一最优解 { dp[i]=dp[i-1]; } pre = cur; } return dp[n]; } };