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;
}
时间: 2024-12-14 18:11:55

UVA10912 - Simple Minded Hashing(dp)的相关文章

Uva 10912 Simple Minded Hashing (计数DP)

4th IIUC Inter-University Programming Contest, 2005 H Simple Minded Hashing Input: standard input Output: standard output Problemsetter: Sohel Hafiz All of you know a bit or two about hashing. It involves mapping an element into a numerical value usi

UVA 10912 Simple Minded Hashing

题意就略了.刚一看被数据吓住了.看到字符要求严格递增.那么如果字串长大于26那必然方案数目为0:同时1+2+3....+24+25+26=351如果大于这个数也是不可能的 令dp[i][j][k]表示第i位为第j个字符和为K时的方案数目 那么 dp[i][j][k]=sum(dp[i-1][m][k-t])  {m<j;k-t尝试将第j位置为t} #include <map> #include <set> #include <list> #include <

hdu_5794_A Simple Chess(lucas+dp)

题目链接:hdu_5794_A Simple Chess 题意: 给你n,m,从(1,1)到(n,m),每次只能从左上到右下走日字路线,有k(<=100)的不能走的位置,问你有多少方案 题解: 画图可看到路线是一个杨辉三角的图,然后我们可以将对应的x,y转换到对应的点上,也可以吧杨辉三角看成一个平行四边形, 我这里看成的平行四边形,设dp[i]为从起点到第i个障碍物的的方案数,那么dp[i]=dp[i]-sum(dp[j](第j个点能走到i这个点)*(j到i的方案数)). 然后我们把终点放到最后

HDU 5794 A Simple Chess (Lucas + dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5794 多校这题转化一下模型跟cf560E基本一样,可以先做cf上的这个题. 题目让你求一个棋子开始在(1,1),只能像马一样走且往右下方走,不经过坏点,有多少种走法能到达(n,m)点. 比如n=6, m=5 有两个坏点,模型转换 如下图: 转换成简单模型之后,只要把棋子可能经过的坏点存到结构体中,按照x与y从小到大排序. dp[i]表示从起点到第i个坏点且不经过其他坏点的方案数. dp[i] = L

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes

散列表(hash table)&mdash;&mdash;算法导论(13)

1. 引言     许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表     在介绍散列表之前,我们前介绍直接寻址表.     当关键字的全域U(关键字的范围)比较小时,直接寻址是一种简单而有效的技术.我们假设某应用要用到一个动态集合,其中每个元素的关键字都是取自于全域U={0,1,-,m-1},其中m不是一个很大的数.另外,假设每个元素的关键字都不同.    为表示动

Bloom Filter布隆过滤器

http://blog.csdn.net/pipisorry/article/details/64127666 Bloom Filter简介 Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定

【算法导论】学习笔记——第11章 散列表

11.1 直接寻址表当关键字的全域U很小,可采用直接寻址的方式.假设动态集合S的元素都取自全域U={0, 1, ..., m-1}的一个关键字,并且没有两个元素具有相同的关键字.为表示动态集合,使用直接寻址表(diret-address table),记为T[0...m-1],其中的每个位置称为槽(slot).直接寻找表就是按照数组索引,缺点明显.基本操作如下: 1 DIRECT-ADDRESS-SEARCH(T, k) 2 return T[k] 3 4 DIRECT-ADDRESS-INSE

Android调用JNI本地方法跟踪目标代码

正如Android调用JNI本地方法经过有点改变章所说跟踪代码是可行的,但是跟踪某些代码会出现anr,点击取消,还是不好运,有提高办法吗?回答是有(gdb还没试过,本文只讨论ida). 下面是我使用 0 * Message("%s = %d\n", GetString(Dword(R2+0x10),-1, ASCSTR_C), R2+0x20)打出的记录 enforceInterface = 1108147904writeInterfaceToken = 1108151492write