uva 10912 - Simple Minded Hashing(计数)
2013-11-05 21:15
435 查看
题目链接:uva 10912 - Simple Minded Hashing
题目大意:给出l和s,表示说用l个字母,组成一个字符串,字符串的权值和要刚好等于s,并且字母要升序排列,不可以重复使用,问有多少种组成。
解题思路:简单dp,三维数组dp[i][j][k]表示说i个字符,最后一个字符为j(即为最大字符为j),权值和为k。
dp[i][j][k] = ∑(0≤t<j) dp[i - 1][t][k - j]; 表示末尾加上一个权值为j的字符。
题目大意:给出l和s,表示说用l个字母,组成一个字符串,字符串的权值和要刚好等于s,并且字母要升序排列,不可以重复使用,问有多少种组成。
解题思路:简单dp,三维数组dp[i][j][k]表示说i个字符,最后一个字符为j(即为最大字符为j),权值和为k。
dp[i][j][k] = ∑(0≤t<j) dp[i - 1][t][k - j]; 表示末尾加上一个权值为j的字符。
#include <stdio.h> #include <string.h> #define min(a,b) (a)<(b)?(a):(b) const int M = 27; const int N = 10005; int dp[M][M] , sum[M] ; void init() { memset(dp, 0, sizeof(dp)); memset(sum, 0, sizeof(sum)); dp[0][0][0] = 1; for (int i = 1; i <= 26; i++) { int top = i * 26; for (int k = 1; k <= top; k++) { int n = min(k, 26); for (int j = 1; j <= n; j++) { for (int t = 0; t < j; t++) dp[i][j][k] += dp[i - 1][t][k - j]; sum[i][k] += dp[i][j][k]; } } } } int main () { init(); int l, s, cas = 1; while (scanf("%d%d", &l, &s), l + s) { l = min(l, 26); printf("Case %d: %d\n", cas++, sum[l][s]); } return 0; }
相关文章推荐
- 让微积分变浮云吧
- SQL中如何使用patindex
- NAND flash的MTD分区与uboot中分区的理解
- SecureCRT跟centOs6.2中的Linux系统上传和下载文件(rz/sz)
- Linux 日历和计算器命令
- 极限的思想
- Html转UBB的JS版本【寻求更好的方案】
- [LeetCode]Median of Two Sorted Arrays
- 上古神器-AWK中高级实例分享-中
- 页面局部加载,适合Ajax Loading场景(Demo整理)
- xctool
- 《推荐系统实践》 阅读笔记
- SAM4E单片机之旅——5、LED呼吸和PWM
- Expression Blend实例中文教程(4) - 布局控件快速入门Canvas
- 页面局部加载,适合Ajax Loading场景(Demo整理)
- [Unity3d]U3d中基本GUI控件
- 【PS】简单操作
- java socket编程
- [Unity3d]U3d中基本GUI控件
- 管理类