题目大意:给你L和S,把小写的26个字母定义为1-26,然后要求找出有多少个这样的字符串,首先要满足严格的递增顺序(a<b<c),并且要有L个字母,而且和为S。
解题思路:这提和之前做过的题目很想,但是不一样的地方在于这题的字母选择是有要求的,不仅仅是和要等于S,还需要保持递增,也就是之前你用过的不能再用的意思。而且这题的范围给的有点大了,其实只有26个字母,最大的和只可能是351。不符合这些的都可以直接输出0.然后就是dp[n][num][sum]:已经放到第n个位置了,这个位置的值是num,而且和是sum。
代码:
#include <cstring>
#include <cstdio>
const int maxn = 27;
const int maxm = 355;
int L, S;
int f[maxn][maxn][maxm];
int dp (int n, int sum, int pre) {
int& ans = f[n][pre][sum];
if (ans != -1)
return ans;
if (n == L) {
if (sum == S)
return ans = 1;
return ans = 0;
}
ans = 0;
for (int i = pre + 1; i < maxn; i++) {
if (sum + i <= S)
ans += dp(n + 1, sum + i, i);
else
break;
}
return ans;
}
int main () {
int cas = 0;
while (scanf ("%d%d", &L, &S) && (L||S)) {
printf ("Case %d: ", ++cas);
if (L >= maxn || S > maxm - 4) {
printf ("0\n");
continue;
}
memset (f, -1, sizeof(f));
printf ("%d\n", dp(0, 0, 0));
}
return 0;
}
时间: 2024-10-05 11:22:58