对每一段零,做动态规划,看有多少方案,最后把所有方案数相乘

例如00035这个数组

以下是声明的一个3*3的数组,横坐标是可以填入的数,纵坐标是0的个数

1 1 1(第一个位置可以填1、2、3)

3 2 1(当一空填1时,二空有1、2、3三种填法;一空填2,二空有2、3两种填法;一空填3,二空有3一种填法)

6 3 1(第三空以此类推)

于是这一段的方案数为6+3+1=10种

因为只有这一段0

所以结果就是10种方案

public class Solution {
    public int FillArray (int[] a, int k) {
        long answer = 1;
        
        int index = 0;
        while(index < a.length) {
        	int zero_num = 0;
    		int min = 1;
    		int max = k;
    		if(index-1>=0)
    			min = a[index-1];
        	if(a[index] == 0) {
        		while(a[index] == 0) {
        			zero_num++;
            		index++;
            		if(index >= a.length)
            			break;
        		}
        		if(index < a.length)
        			max = a[index];
        		int[] list = new int[max-min+1];
        		for (int i = 0; i < list.length; i++) {
					list[i] = 1;
				}
        		for (int i = 1; i < zero_num; i++) {
					for (int j = 0; j < list.length; j++) {
						for (int j2 = j+1; j2 < list.length; j2++) {
							list[j] = (list[j]+list[j2]) % (int)(Math.pow(10, 9)+7);
						}
					}
				}
        		int sum = 0;
        		for (int i = 0; i < list.length; i++) {
					sum = (sum+list[i]) % (int)(Math.pow(10, 9)+7);
				}
        		answer = (answer*sum) % (int)(Math.pow(10, 9)+7);
        	}else {
				index++;
			}
        }
        
        return (int)answer;
    }
}