【OpenJudge9267】【递推】核电站

核电站

总时间限制: 5000ms 单个测试点时间限制: 1000ms 内存限制: 131072kB

【描述】

一个核电站有N个放核物质的坑,坑排列在一条直线上。如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质。

任务:对于给定的N和M,求不发生爆炸的放置核物质的方案总数 

【输入】

只一行,两个正整数N,M( 1 < N < 50,2 ≤ M ≤ 5 )

【输出】

一个正整数S,表示方案总数。

【样例输入】

4 3

【样例输出】

13

【Solution】

  dp[i]表示到第i个坑的方案数。首先考虑i<M的情况,即每个坑放或不放都可,共(1<<i)或dp[i]=dp[i-1]*2种方案。然后考虑i>=M的情况,用所有的方案数减去不合法的方案数dp[i]=dp[i-1]*2-dp[i-M-1]即可。

  AC代码:

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 int N,K;
 5 long long dp[110]; 
 6 int main(){
 7     scanf("%d%d",&N,&K); dp[1]=2; dp[0]=1; dp[-1]=1;
 8     for(int i=2;i<K;++i) dp[i]=dp[i-1]<<1;
 9     for(int i=K;i<=N;++i) dp[i]=(dp[i-1]<<1)-dp[i-K-1];
10     printf("%lld",dp[N]);
11     return 0;
12 }

 

posted @ 2016-10-27 10:12  Reddest  阅读(344)  评论(0编辑  收藏  举报