设 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k]为选了前n个音符且m个重音符,第i个音符是否为重音符,k=1是,0不是。
那么就可以直接转移了,注意一点细节,当m=1时,只从m=0转移过来,因为第一个可以随便放的。
class Solution {
public:
/**
*
* @param n int整型 乐谱总音符数
* @param m int整型 重音符数
* @param k int整型 重音符之间至少的间隔
* @return long长整型
*/
long long solve_bangbang(int n, int m, int k) {
// write code here
const int mod=1e9+7;
long long dp[1005][1005][5]={0};
dp[0][0][0]=1;
for(int i=1;i<=n;i++)
{
dp[i][0][0]=1;
for(int j=1;j<=m;j++)
{
if(j==1)
{
dp[i][j][1]=dp[i-1][0][0]%mod;
}
else if(i-k-1>=0)
{
dp[i][j][1]=(dp[i-k-1][j-1][0]+dp[i-k-1][j-1][1])%mod;
}
dp[i][j][0]=(dp[i-1][j][0]+dp[i-1][j][1])%mod;
}
}
return (dp[n][m][0]+dp[n][m][1])%mod;
}
};