【题目】
【思路】
令 表示前 个小写字母组合成字符串的前 个长度的可能情况数目。
易得临界值为前 个小写字母组合长度为0的情况只有一种就是不选,
假设第 个字母的个数为 个,那么可以得到前 个字母组成 个长度的字符串的可能情况数目:
题目给定最多被按 次,因此我们得到状态转移方程:
表示组合数从a个里面选b个,临界值为
递推式为 ,比较好理解,因为如果可选择的范围增加一个数,这个数可以被选或者不被选。
【代码】
class Solution {
public:
int keyboard(int k, int n) {
const int mod=1e9+7;
// 组合数
long long C[200][200];
for(int i=0;i<200;i++){
C[i][0]=C[i][i]=1;
for(int j=1;j<i;j++){
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
}
// dp[i][j]->前i个字母组成字符串的前j个长度字符串的可能情况
long long dp[30][n+5];
memset(dp, 0, sizeof dp);
for(int i=0;i<=26;i++){
dp[i][0]=1;
}
for(int i=1;i<=26;i++){
for(int j=1;j<=n;j++){
for(int p=0;p<=min(k,j);p++){
dp[i][j]=(dp[i][j]+dp[i-1][j-p]*C[j][p])%mod;
}
}
}
return (int)dp[26][n];
}
};