HDU 4906 Our happy ending

pid=4906" style="">题目链接

题意:给定n个数字,每一个数字能够是0-l,要选当中一些数字。然后使得和为k,问方案

思路:状压dp。滚动数组,状态表示第i个数字。能组成的数字状态为s的状态,然后每次一个数字,循环枚举它要选取1 - min(l,k)的多少,然后进行状态转移

代码:

#include <cstdio>
#include <cstring> typedef long long ll; const int N = (1<<20) + 5;
const ll MOD = 1000000007;
int t, n, k;
ll l, dp[N]; int main() {
scanf("%d", &t);
while (t--) {
scanf("%d%d%lld", &n, &k, &l);
int s = (1<<k);
if (l > k) {
ll yu = l - k;
l = k;
}
memset(dp, 0, sizeof(dp));
dp[0] = 1;
while (n--) {
for (int i = s - 1; i >= 0; i--) {
if (dp[i] == 0) continue;
ll tmp = yu * dp[i] % MOD;
ll now = dp[i];
for (int j = 1; j <= l; j++) {
int next = i|((i<<j)&(s - 1)|(1<<(j - 1)));
dp[next] = (dp[next] + now) % MOD;
}
dp[i] = (dp[i] + tmp) % MOD;
}
}
ll ans = 0;
for (int i = 0; i < s; i++) {
if (i&(1<<(k - 1))) {
ans = (ans + dp[i]) % MOD;
}
}
printf("%lld\n", ans);
}
return 0;
}

最新文章

  1. ORA-01861: 文字与格式字符串不匹配
  2. java list去重
  3. MySQL 升级详细步骤 (包括 Percona)
  4. Android属性动画之ValueAnimation
  5. Javascript中的循环变量声明,到底应该放在哪儿?
  6. 安装mysql5.5时候的报错解决办法:
  7. Base64 算法原理,以及编码、解码【加密、解密】 介绍
  8. yii2顶部导航使用
  9. 几个关于wcf、rest服务的好帖子
  10. 在 OS X Yosemite 中部署Mesos
  11. java 求取某一段时间内的每一天、每一月、每一年
  12. Android wakelock机制
  13. maven常用插件配置详解
  14. 远程使用Gpupdate(Hash,哈希)
  15. 飘逸的python - 一个最简单的服务器
  16. C---数组名作函数参数
  17. 最完整苹果IOS个人开发账号升级方法-个人开发账号升级为公司开发者账号常见误区
  18. 深入理解yield(二):yield与协程
  19. certificate verify fails (https://gems.ruby-china.org错误
  20. SettingsSVNPlugin

热门文章

  1. [Apple开发者帐户帮助]一、开始(3)账户信息
  2. netty支持SSL,OpenSSL
  3. python实践
  4. MySQL实现递归查询
  5. springmvc 中将MultipartFile转为file,springboot 注入CommonsMultipartResolver
  6. 在命令提示符窗口下(cmd)使用指令操作并编译java代码,运行java编译代码
  7. C#使用wkhtmltopdf,把HTML生成PDF(包含分页)
  8. 【PostgreSQL-9.6.3】修改监听的IP和端口
  9. ASP.NET刷新页面的六种方法
  10. 使用OpenCV画折线图