题意:


方法一:
动态规划

思路:
        dp[i][j]表示填充i个数,取值个数是j的方案数。
        状态转移方程如下:
            

        因为本题涉及多段连续的 0 ,因此,计算每一段连续 0 的方案,并且累乘即可。


#define ll long long

class Solution {
public:
    const int MOD=1e9+7;
    ll dp[1005][1005]={0};//dp[i][j]表示填充i个数,取值个数是j的方案数
    int FillArray(vector<int>& a, int k) {
        ll res=1;
        int n=a.size();
        //初始化
        for(int i=1;i<=k;i++){
            dp[1][i]=i;
        }
        for(int i=2;i<=n;i++){
            for(int j=1;j<=k;j++){
                dp[i][j]=(dp[i-1][j]+dp[i][j-1])%MOD;//状态转移方程
            }
        }
        
        int i=0;
        while(i<n){//计算每一段的方案数,累乘
            
            while(i<n&&a[i]!=0){
                i++;
            }
            if(i==n)
                break;
            int l=i;//左区间
            int x=i>0?a[i-1]:1;
            while(i<n&&a[i]==0){
                i++;
            }
            int r=i;//右区间
            int y=i<n?a[i]:k;
            res=(res*dp[r-l][y-x+1])%MOD;//累乘
        }
        return res;
    }
};


时间复杂度:
空间复杂度:

方法二:
java

思路:
        dp[i][j]表示填充i个数,取值个数是j的方案数。
        状态转移方程如下:
        
dp[i][j]=(dp[i-1][j]+dp[i][j-1])%MOD;//状态转移方程



import java.util.*;


public class Solution {
    
    int MOD=1000000007;
    long[][] dp=new long[1005][1005];//dp[i][j]表示填充i个数,取值个数是j的方案数
    public int FillArray(int[] a, int k) {
        long res=1;
        int n=a.length;
        //初始化
        for(int i=1;i<=k;i++){
            dp[1][i]=i;
        }
        for(int i=2;i<=n;i++){
            for(int j=1;j<=k;j++){
                dp[i][j]=(dp[i-1][j]+dp[i][j-1])%MOD;//状态转移方程
            }
        }
        
        int i=0;
        while(i<n){//计算每一段的方案数,累乘
            
            while(i<n&&a[i]!=0){
                i++;
            }
            if(i==n)
                break;
            int l=i;//左区间
            int x=i>0?a[i-1]:1;
            while(i<n&&a[i]==0){
                i++;
            }
            int r=i;//右区间
            int y=i<n?a[i]:k;
            res=(res*dp[r-l][y-x+1])%MOD;//累乘
        }
        return (int)res;
    }
}


时间复杂度:
空间复杂度: