K好数,求大神用正确的动态规划实现,
											如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。
输入格式
输入包含两个正整数,K和L。
输出格式
输出一个整数,表示答案对1000000007取模后的值。
样例输入
4 2
样例输出
7
数据规模与约定
对于30%的数据,KL <= 106;
对于50%的数据,K <= 16, L <= 10;
对于100%的数据,1 <= K,L <= 100。
本人也做了,但行不通,时间太长,效
 程序代码:
程序代码:#include <stdio.h>
#include <stdlib.h>
static int N1=0;
static int N2=1;
int jude(int n[],int wei)
{
    int jude2(int n[],int n1,int n2,int wei);
    if(wei==1)
    return 0;
    if(wei==2)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
        return 1;
    }
    if(wei==3)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          return 1;
    }
    if(wei==4)
    {
   
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          return 1;
    }
    if(wei==5)
    {
           
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          return 1;
    }
    if(wei==6)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          return 1;
    }
    if(wei==7)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          return 1;    
    }
    if(wei==8)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          return 1;
    }
    if(wei==9)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          return 1;
    }
    if(wei==10)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          return 1;
    }
    if(wei==11)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          if((n[9]+1!=n[10])&&(n[9]-1!=n[10]))
          return 1;
    }
    if(wei==12)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          if((n[9]+1!=n[10])&&(n[9]-1!=n[10]))
          if((n[10]+1!=n[11])&&(n[10]-1!=n[11]))
          return 1;
    }
    if(wei==13)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          if((n[9]+1!=n[10])&&(n[9]-1!=n[10]))
          if((n[10]+1!=n[11])&&(n[10]-1!=n[11]))
          if((n[11]+1!=n[12])&&(n[11]-1!=n[12]))
          return 1;
    }
    if(wei==14)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          if((n[9]+1!=n[10])&&(n[9]-1!=n[10]))
          if((n[10]+1!=n[11])&&(n[10]-1!=n[11]))
          if((n[11]+1!=n[12])&&(n[11]-1!=n[12]))
          if((n[12]+1!=n[13])&&(n[12]-1!=n[13]))
          return 1;
    }
    if(wei==15)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          if((n[9]+1!=n[10])&&(n[9]-1!=n[10]))
          if((n[10]+1!=n[11])&&(n[10]-1!=n[11]))
          if((n[11]+1!=n[12])&&(n[11]-1!=n[12]))
          if((n[12]+1!=n[13])&&(n[12]-1!=n[13]))
          if((n[13]+1!=n[14])&&(n[13]-1!=n[14]))
          return 1;
    }
    if(wei==16)
    {
        if((n[0]+1!=n[1])&&(n[0]-1!=n[1]))
          if((n[1]+1!=n[2])&&(n[1]-1!=n[2]))
          if((n[2]+1!=n[3])&&(n[2]-1!=n[3]))
          if((n[3]+1!=n[4])&&(n[3]-1!=n[4]))
          if((n[4]+1!=n[5])&&(n[4]-1!=n[5]))
          if((n[5]+1!=n[6])&&(n[5]-1!=n[6]))
          if((n[6]+1!=n[7])&&(n[6]-1!=n[7]))
          if((n[7]+1!=n[8])&&(n[7]-1!=n[8]))
          if((n[8]+1!=n[9])&&(n[8]-1!=n[9]))
          if((n[9]+1!=n[10])&&(n[9]-1!=n[10]))
          if((n[10]+1!=n[11])&&(n[10]-1!=n[11]))
          if((n[11]+1!=n[12])&&(n[11]-1!=n[12]))
          if((n[12]+1!=n[13])&&(n[12]-1!=n[13]))
          if((n[13]+1!=n[14])&&(n[13]-1!=n[14]))
          if((n[14]+1!=n[15])&&(n[14]-1!=n[15]))
          return 1;
    }
    if(wei>=2)
    {
        if(jude2(n,N1,N2,wei)==1)
         return 1;
    }
    return 0;
}
int jude2(int n[],int n1,int n2,int wei)
{
    if((n[n1]+1!=n[n2])&&(n[n1]-1!=n[n2])&&n2<=wei)
      {
        jude2(n,N1+=1,N2+=1,wei);
        return 1;
         }
       return 0;
}
void jinzi(int n[],int k,int ge,int shi)
{
    n[shi]+=1;
    n[ge]=0;
    if(n[shi]==k&&shi>0)
    jinzi(n,k,ge-=1,shi-=1);
}
int leave(int n[],int n1,int n2,int k,int wei)
{
    if((n[n1]==k-1)&&n[n2]==k-1&&n2<wei)
      {
        leave(n,n1+=1,n2+=1,k,wei);
        return 1;
         }
       return 0;
}
int trans(int k,int wei)
{
    int number=0;
    if(k<=2)
    return 0;
    int N[100];
    int f1,f2;
    N[0]=1;
    for(f1=1;f1<wei;f1++)
    {
        N[f1]=0;
    }
    while(1)
    {
        N[wei-1]++;
        if(N[wei-1]==k)
         jinzi(N,k,wei-1,wei-2);
        if(jude(N,wei)==1)
         number++;
        if(leave(N,0,1,k,wei)==1)
         break;
    }
    return number%1000000007;
}
int main(int argc, char *argv[]) {
    int k,l,j;
    scanf("%d%d",&k,&l);
    printf("%d",trans(k,l));
    scanf("%d",&j);
    return 0;
}率低,在OJ上得10分,代码如下,求大神出更好的代码,



 
											





 
	    

 
	





 ,照顾下小白啦
,照顾下小白啦										
					
	 
										
					
	
 那个 4 2 7 的结果是正确的。。。 不过其他的就不知道了 。。。。
 那个 4 2 7 的结果是正确的。。。 不过其他的就不知道了 。。。。 
										
					
	