题目描述
注意点
首先是思考问题:
这题的动态思路先是想dp坐标的i,j的意义:
关键是选与不选
初始化:当只有选择一个的时候
注意点:合法性
特例:当m==0时候组合数应该是1
package niuniu;
public class bang {
public long solve_bangbang (int n, int m, int k) {
// write code here
//定义动态规划数组,dp[i][j]表示在前i个字符中选择j个重音符的组合数
long result=0;
if(m==0) return 1;
if(n>=(m-1)*k+m) {
long[][] dp=new long[n+1][m+1];
for (int i = 1; i<=n; i++) {
dp[i][1]=i;
}
for (int i = k+2; i <=n; i++) {
for (int j = 1; j <=m; j++) {
//dp[i][j]的组合数等于第i个字符是重音符的组合数+不是重音符的组合数
//是:dp[i-k-1][j-1]
//不是:dp[i-1][j]
//下标是合法的i-k-1>=1,则i>=k+2
dp[i][j]=(dp[i-1][j]+dp[i-k-1][j-1])%1000000007;
}
}
result=dp[n][m];
}
return result;
}
}