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       }

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

转载于:https://www.cnblogs.com/-sunshine/archive/2013/03/05/2945114.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值