题目:

We have a sorted set of digits D, a non-empty subset of {'1','2','3','4','5','6','7','8','9'}.  (Note that '0' is not included.)

Now, we write numbers using these digits, using each digit as many times as we want.  For example, if D = {'1','3','5'}, we may write numbers such as '13', '551', '1351315'.

Return the number of positive integers that can be written (using the digits of D) that are less than or equal to N.

Example 1:

Input: D = ["1","3","5","7"], N = 100
Output: 20
Explanation:
The 20 numbers that can be written are:
1, 3, 5, 7, 11, 13, 15, 17, 31, 33, 35, 37, 51, 53, 55, 57, 71, 73, 75, 77.

Example 2:

Input: D = ["1","4","9"], N = 1000000000
Output: 29523
Explanation:
We can write 3 one digit numbers, 9 two digit numbers, 27 three digit numbers,
81 four digit numbers, 243 five digit numbers, 729 six digit numbers,
2187 seven digit numbers, 6561 eight digit numbers, and 19683 nine digit numbers.
In total, this is 29523 integers that can be written using the digits of D.

Note:

  1. D is a subset of digits '1'-'9' in sorted order.
  2. 1 <= N <= 10^9

题意理解:

给了你一个string数组D,和一个数字N。D中每个string包含的是一个数字字符。相当于就是D中包含了LD个一位数字,然后用这些数字进行组合,只要比N小就满足条件,问一共有多少种满足条件的组合可能。

DP思想:

对于D的组合,当组合的数字长度小于N的长度时,很好理解,就是D的size的i次幂相加,1 <= i < D;

当组合的数字长度等于N的长度时,情况就有点复杂了,但是我们可以通过DP的思想来理解。

即对于数字N从右往左扫描,如果对于一个扫描的点,再遍历D。

1.如果D中的一个数字小于N中的当前值,那么当前位置的组合数就加上D长度的一个次幂,具体多少次幂,取决于N中当前位置,相当于就是 1XXX, 2abc 组合数就是D长度的3次幂。

2.如果D中的一个数字等于N中的当前值,那么就加上前一个位置的组合数,相当于就是 1XXXX 和 1XXXX;组合数取决于后4位。

3.如果D中的一个数字比N中的当前值大,其实不用处理,因为我们设定的DP数组初始值都是0;

需要注意的就是DP数组要多开一个位置,存储最后一个值1,自己随便写一个就知道原因了。

代码:

class Solution {
public:
int atMostNGivenDigitSet(vector<string>& D, int N) {
string s = to_string(N);
int LD = D.size();
int LN = s.size();
int ans = 0;
int DP[LN+1];
memset(DP, 0, sizeof(DP));
DP[LN] = 1; for(int i = LN-1; i >= 0; i--)
{
int nt = s[i] - '0';
for(int j = 0; j < LD; j++)
{
if(D[j][0] - '0' == nt)
DP[i] += DP[i+1];
else if(D[j][0] - '0' < nt)
DP[i] += pow(LD, LN - i - 1);
} } for(int j = 1; j < LN; j++)
{ DP[0] += pow(LD, j);
} return DP[0];
}
};

  

LeetCode902. Numbers At Most N Given Digit Set的更多相关文章

  1. [Swift]LeetCode902. 最大为 N 的数字组合 | Numbers At Most N Given Digit Set

    We have a sorted set of digits D, a non-empty subset of {'1','2','3','4','5','6','7','8','9'}.  (Not ...

  2. 902. Numbers At Most N Given Digit Set

    We have a sorted set of digits D, a non-empty subset of {'1','2','3','4','5','6','7','8','9'}.  (Not ...

  3. [LeetCode] 902. Numbers At Most N Given Digit Set 最大为 N 的数字组合

    We have a sorted set of digits D, a non-empty subset of {'1','2','3','4','5','6','7','8','9'}.  (Not ...

  4. LeetCode 902. Numbers At Most N Given Digit Set

    应该是常数 N的位数时间级别 我的这个方法超时很严重...但是特此记录 费劲巴拉写的... 超时: int atMostNGivenDigitSet(char** D, int DSize, int ...

  5. 由最多N个给定数字集组成的数字 Numbers At Most N Given Digit Set

    2019-10-14 22:21:29 问题描述: 问题求解: 暴力求解必然会超时,那么就需要考虑数学的方法来降低时间复杂度了. public int atMostNGivenDigitSet(Str ...

  6. F. Igor and Interesting Numbers

    http://codeforces.com/contest/747/problem/F cf #387 div2 problem f 非常好的一道题.看完题,然后就不知道怎么做,感觉是dp,但是不知道 ...

  7. About Intel® Processor Numbers

    http://www.intel.com/content/www/us/en/processors/processor-numbers.html About Intel® Processor Numb ...

  8. ural 1289. One Way Ticket

    1289. One Way Ticket Time limit: 1.0 secondMemory limit: 64 MB A crowed of volunteers dressed in the ...

  9. CSUFT 1003 All Your Base

    1003: All Your Base Time Limit: 1 Sec      Memory Limit: 128 MB Submit: 4      Solved: 2 Description ...

随机推荐

  1. 代码查看import的类是出自哪个jar包的方法(转)

    import java.security.ProtectionDomain; import java.security.CodeSource; public static void main(Stri ...

  2. memcache 加载(对象)所遇到的问题。资源

    <?php $mem =new memcache(); if($mem->connect('127.0.0.1','11211')){ echo '连接OK'.'<br>'; ...

  3. convertTo

    转自 http://blog.csdn.net/xiaxiazls/article/details/51204265 在使用Opencv中,常常会出现读取一个图片内容后要把图片内容的像素信息转为浮点并 ...

  4. CF 1091E New Year and the Factorisation Collaboration

    昨晚Good Bye 2018D题没做出来,车翻大了…… 官方题解      传送门 初赛知识:一个无向图所有顶点度数之和为偶数.然而这东西还有一个高端的名字:Handshaking lemma 但是 ...

  5. 用Linq取两个数组的差集

    两个数组,取其差集,用Linq做比较方便,效率也比较高,具体如下示例 有两个数组list1 和list2 ,如下 List<int> list1 = new List<int> ...

  6. g2o:一种图优化的C++框架

    转载自 Taylor Guo g2o: A general framework for graph optimization 原文发表于IEEE InternationalConference on ...

  7. SpringMVC——RequestMapping

    一.@RequestMapping 映射请求 Spring MVC 通过@RequestMapping注解可以定义不同的处理器映射规则. @RequestMapping放在类名上边,设置请求前缀 方法 ...

  8. orcad找不到dll

    如果运行Capture.exe找不到cdn_sfl401as.dll,如果运行allegro.exe找不到cnlib.dll,(上面俩个库文件都在C:/Cadence/SPB_16.3/tools/b ...

  9. 快速获取.NET DLL文件编译时间

    当用户现场汇报问题给我们, 我们比较关心的就有用户现场的DLL是什么版本号,是什么时候编译的. 有没有什么办法得到呢?办法是有的. 在网上找了很久终端找到这个软件非常地好用. 直接把文件拖到软件里就行 ...

  10. Underscore.js 1.3.3 中文解释

    // Underscore.js 1.3.3 // (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. // Underscore is freely ...