【动态规划】 343. 整数拆分 91. 解码方法

343. 整数拆分

class Solution {
public:
    int integerBreak(int n) {
        if(n <= 2)
            return 1;
        int dp[n+1];
        dp[1] = 1;
        dp[2] = 1;
        for(int i=3;i<=n;++i){
            dp[i] = 1;
            for(int j=1;j<i;++j)
                dp[i] = max(dp[i], max(dp[i-j] * j, (i-j) * j));
            // cout << i << " " << dp[i] << endl;
        }
        return dp[n];
    }
};

91. 解码方法

class Solution {
public:
    int numDecodings(string s) {
        int s_len = s.size();
        int dp[s_len][2];
        if(s[0] == '0')
            return 0;
        dp[0][0] = 1;
        dp[0][1] = 0;
        int num1, num2;
        for(int i=1;i<s_len;++i){
            num1 = s[i-1] - '0';
            num2 = s[i] - '0';
            if(num1 == 0 || num1 * 10 + num2 > 26)
                dp[i][1] = 0;
            else
                dp[i][1] = (i-2 >= 0 ? (dp[i-2][0] + dp[i-2][1]) : 1); 
            if(num2 == 0)
                dp[i][0] = 0;
            else
                dp[i][0] = dp[i-1][0] + dp[i-1][1];
            if(!dp[i][0] && !dp[i][1])
                return 0;
        }
        return dp[s_len-1][1] + dp[s_len-1][0];
    }
};
posted @ 2022-03-02 10:40  fwx  阅读(29)  评论(0)    收藏  举报