算法练习笔记(十一)— 动态规划之分解问题
2017-05-29 22:07
274 查看
许久没更新算法作业,实在惭愧,会在最近几天一起补全
动态规划的实质实际就是不断地打破问题为一个又一个的子问题,和递归不同的是,它避开了重复计算的部分,成就了一个高效的算法。
然而动态规划常常没有固定的模板,稍一不注意就会发生维数灾。
今天的leetcode题目是这样的:
地址:https://leetcode.com/problems/count-numbers-with-unique-digits/#/description
题目:Count Nums with unique Digits
题目描述:
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n.
Example:
Given n = 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding
即给一个非负数n,并在0 ~ 10^n中找出组成数字均不同的数的个数x
因为属于动态规划的问题,理所当然我们就会想到将所得解建立在前面解的结果的基础之上的思路,于是观察这些数字
发现原来在后面的数字之中,前面所得的数字其实是包含其中的,因此大可不必重复计算,则所得的结果应该为(新增数个数 + 之前已有个数)
即f(n) = (10 - n + 1)(f(n - 1) - f(n - 2)) + f(n - 1) 可化简为 f(n) = (12 - n)* f(n - 1) - (11 - n) * f(n - 2)
我们可以轻松得知f(1) = 10, f(0) = 0,则之后的结果便可推知
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
if(n > 9)n = 9;
return NumsCount(n);
}
int NumsCount(int n){
if(n == 0)return 1;
if(n == 1)return 10;
else
return (12 - n) * NumsCount(n - 1) - (11 - n) * NumsCount(n - 2);
}
};
动态规划的实质实际就是不断地打破问题为一个又一个的子问题,和递归不同的是,它避开了重复计算的部分,成就了一个高效的算法。
然而动态规划常常没有固定的模板,稍一不注意就会发生维数灾。
今天的leetcode题目是这样的:
地址:https://leetcode.com/problems/count-numbers-with-unique-digits/#/description
题目:Count Nums with unique Digits
题目描述:
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n.
Example:
Given n = 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding
[11,22,33,44,55,66,77,88,99])
即给一个非负数n,并在0 ~ 10^n中找出组成数字均不同的数的个数x
因为属于动态规划的问题,理所当然我们就会想到将所得解建立在前面解的结果的基础之上的思路,于是观察这些数字
发现原来在后面的数字之中,前面所得的数字其实是包含其中的,因此大可不必重复计算,则所得的结果应该为(新增数个数 + 之前已有个数)
即f(n) = (10 - n + 1)(f(n - 1) - f(n - 2)) + f(n - 1) 可化简为 f(n) = (12 - n)* f(n - 1) - (11 - n) * f(n - 2)
我们可以轻松得知f(1) = 10, f(0) = 0,则之后的结果便可推知
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
if(n > 9)n = 9;
return NumsCount(n);
}
int NumsCount(int n){
if(n == 0)return 1;
if(n == 1)return 10;
else
return (12 - n) * NumsCount(n - 1) - (11 - n) * NumsCount(n - 2);
}
};
相关文章推荐
- 算法笔记(问题分解,分治与动态规划)
- 算法笔记(问题分解,分治与动态规划)
- [算法学习笔记]动态规划之钢条切割问题
- 算法笔记——【动态规划】矩阵连乘问题
- 算法笔记_059:蓝桥杯练习 Anagrams问题(Java)
- 每周算法练习——用动态规划求解最短路径问题
- 0011算法笔记——【动态规划】最长公共子序列问题(LCS)
- 0010算法笔记——【动态规划】矩阵连乘问题
- 算法练习笔记(十)——动态规划之回文子列的查找
- 0013算法笔记——【动态规划】最大子段和问题,最大子矩阵和问题,最大m子段和问题
- 0019算法笔记——【动态规划】0-1背包问题
- 算法笔记——【动态规划】最长公共子序列问题(LCS)
- 0020算法笔记——【动态规划】最优二叉搜索树问题
- 0009算法笔记——【动态规划】动态规划与斐波那契数列问题,最短路径问题
- 0010算法笔记——【动态规划】矩阵连乘问题
- 算法笔记:动态规划求解最长子序列问题
- 0012算法笔记——【动态规划】最长公共子串问题
- 算法学习笔记----用动态规划解决钢管切割问题
- 【笔记】【算法学习】【动态规划】背包问题总结(1)
- 【算法学习】切割木棍问题——动态规划