UVA10912 - Simple Minded Hashing(dp)

50 篇文章 0 订阅

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值