UVA10912 - Simple Minded Hashing(dp)

UVA10912 - Simple Minded Hashing(dp)

题目链接

题目大意:给你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;
}

你可能感兴趣的:(UVA10912 - Simple Minded Hashing(dp))