dp 南航1108

连续数列

Time Limit(Common/Java):1000MS/3000MS          Memory Limit:65536KByte Total Submit:223            Accepted:62 Description

给你P个数字1,2,3,...,P

你可以把这些数字组成长度为L的数字串

但是这个串不能出现有连续K个或者K个以上的数字1。

(1<=P<=9 1<L<=30 1<K<=L)

比如,P=2 L=3 K=2有如下情况

1 2 1

1 2 2

2 1 2

2 2 1

2 2 2

共有5种

 

再比如 P=3 L=3 K=3有如下情况

1 1 2          2 1 1          3 1 1

1 1 3          2 1 2          3 1 2

1 2 1          2 1 3          3 1 3

1 2 2          2 2 1          3 2 1

1 2 3          2 2 2          3 2 2

1 3 1          2 2 3          3 2 3

1 3 2          2 3 1          3 3 1

1 3 3          2 3 2          3 3 2

                 2 3 3          3 3 3

有26种

Input

现在输入P L K

Output

给出答案数

Sample Input

3 3 3

Sample Output

26

Hint

需要高精度

思路:
考虑最后一位是不是1的情况~

View Code
 1 memset(dp,0,sizeof(dp));
 2 dp[0][0]=1;
 3 for(i=1;i<=L;i++)
 4       for(j=0;j<K&&j<=i;j++){
 5            if(j==0)//最后一个字符不是1
 6                   for(k=0;k<K;k++)
 7                         dp[i][j]+=dp[i-1][k]*(P-1);
 8             else//最后一个字符是1
 9                   dp[i][j]+=dp[i-1][j-1];
10       }

但是会溢出,需要用高精度~

posted @ 2013-03-05 21:35  _sunshine  阅读(233)  评论(0)    收藏  举报