解法一:
设f[i][j]表示前i个坑末尾连续放了j个核物质;
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;
typedef long long LL;
#define MAXN (233)
LL dp[MAXN][MAXN];
int main()
{
LL n, m;
scanf("%I64d%I64d", &n, &m);
dp[1][0] = dp[1][1] = 1;
for(int i = 2; i <= n; ++ i)
{
dp[i][0] = dp[i-1][0];
for(int j = 1; j < m; ++ j)
{
dp[i][j] += dp[i-1][j-1];
dp[i][0] += dp[i-1][j];
}
}
LL ans = 0;
for(int i = 0; i <= m; ++ i)
ans += dp[n][i];
cout << ans << endl;
return 0;
}
解法二:
http://blog.csdn.net/lengxuenong/article/details/50535192
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;
typedef long long LL;
#define MAXN (233)
LL dp[MAXN];
int main()
{
LL n, m;
scanf("%I64d%I64d", &n, &m);
dp[0] = 1;
for(int i = 1; i <= n; ++ i)
{
if(i < m) dp[i] = dp[i-1]*2;
else if(i == m) dp[i] = dp[i-1]*2-1;
else dp[i] = dp[i-1]*2 - dp[i-m-1];
}
cout << dp[n];
return 0;
}