大概需要更多方案数这方面DP的练习……
题意:在n个位置放 <= m个核电站,有多少种放法使最长连续核电站数 <= m
dp[i][j]定义:以第i个核电站为终点,最放连续j个核电站的方案数
这样若j位置连续大于等于1个,则方案数为dp[i][j] = dp[i - 1][j - 1],
若位置j连续为0,则为dp[i - 1]这一层所有状态方案数的总和
注意枚举时j始终 < m,
#include<cstdio>
using namespace std;
const int MAXN = 1000 + 50;
long long dp[MAXN][MAXN];
int n,m;
long long ans;
int main(){
scanf("%d%d",&n,&m);
dp[1][0] = 1;dp[1][1] = 1;
for(int i = 2;i <= n;i ++){
for(int j = 0;j < m;j ++){
if(j)dp[i][j] = dp[i - 1][j - 1];
else
for(int k = 0;k < m;k ++){
dp[i][j] += dp[i - 1][k];
}
}
}
for(int i = 0;i < m;i ++)ans += dp[n][i];
printf("%lld",ans);
return 0;
}