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];
    }
};

 

posted @ 2020-10-10 16:24  γGama  阅读(139)  评论(0编辑  收藏  举报