---
# System prepended metadata

title: 1416. Restore The Array
tags: [Leetcode, Dynamic Programming, Hard]

---

# 1416. Restore The Array
###### tags: `Leetcode` `Hard` `Dynamic Programming`
Link: https://leetcode.com/problems/restore-the-array/
## 思路
令```dp[i]```表示以第```i```个数字结尾的array有多少种。只需要遍历最后一个number的范围```s[j:i]```（最多不超过10个digit）。只要```s[j:i]```符合题目的要求（没有leading zero、在```[1,k]```之间），那么就可以更新```dp[i]+=dp[j-1]```.
由于这题也要设置初始值这样就需要dp[1]对应到s[0], 考虑起来很麻烦 所以在s前面加了一个用来凑数的'#'([1043. Partition Array for Maximum Sum](https://hackmd.io/sSjKhGdcQrmWNvAvq0s6bw)和[1105. Filling Bookcase Shelves](https://hackmd.io/SStKMDA2S2OdA5X256a7KA)也是需要前面加一个凑数的的题)
## Code
```java=
class Solution {
    public int numberOfArrays(String s, int k) {
        int n = s.length();
        s = '#'+s;
        char[] charArr = s.toCharArray();
        long[] dp = new long[n+1];
        dp[0] = 1;
        int mod = 1000000007;
        for(int i=1; i<=n; i++){
            long val = 0;
            for(int j=i; j>=Math.max(1, i-9); j--){
                if(s.charAt(j)=='0') continue;
                val += Math.pow(10,i-j)*(s.charAt(j)-'0');
                if(val>=1 && val<=k) dp[i] = (dp[j-1]+dp[i])%mod;
                if(val>k) break;
            }
        }
        return (int)dp[n];
    }
}
```