/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型一维数组 * @param aLen int a数组长度 * @param k int整型 * @return int整型 */ int FillArray(int* a, int aLen, int k ) { // write code here long f[aLen][k]; //一个数组来保存会用到的值 第二行为需要填充两个数。第2列表示有两个数可以填充 int mod=1000000007; int i=1,j=0,m=0; //关于数组(i,j),i个数,j个值.第i个为max,(i-1,j)种。为max-1,有(i-1,j-1)种。为max-2,有(i-1,j-2)种。直至(i-1,1)手工写下这个数组,会发现如19行表示。 for(j=0;j<k;j++){f[0][j]=i;i++;} //第一行赋值为1,2,3,4,5,6.。。 for(i=1;i<aLen;i++){f[i][0]=1;} //第一列赋值为1,1,1,1,1, for(i=1;i<aLen;i++){ //根据输入的参数,确定可能会用到的f[i][j]; for(j=1;j<k;j++){ f[i][j]=(f[i-1][j]+f[i][j-1])%mod; //mod防止溢出 } } printf("%ld %ld",f[1][4],f[aLen-1][k-1]); int r=0,l=0,l1=0,l2=0,num=1,flag=0; for(i=0;i<aLen;i++){ //外层循环判断数组里的树,主要为了找零 flag=0; j=i; while(a[j]==0&&j<aLen){ //为了找连续为零的个数 j++; flag=1; //跳出while的时候,j是连续零后面的序号 } if(flag==1){ //有零就找 if(i==0){ //l为了确定前面数组里的列(值的个数), l1=1; }else{ l1=a[i-1]; //值的下限,注意,下限最小为1 } if(j==aLen){ l2=k; } else{ l2=a[j]; //值的上限, } l=l2-l1; //值 r=j-i-1; //填充个数 num=(num*f[r][l])%mod; //mod防止溢出 } i=j; } return num; }