【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 }