HDU 4906 Our happy ending 状压DP
来源:互联网 发布:弹珠枪在淘宝上怎么搜 编辑:程序博客网 时间:2024/06/05 15:50
题意:给 出 n,k<=20 , 0<=L<=10^9. 要求构造一个序列a_1,a_2,...,a_n,满足 0<=a_i<=l,并且其中的某些数的sum=k,求可能的序列的总数。
dp[p] 表示当前构造的序列可以加和得到(1,2,3...k的各种组合)的方案总数。
状态转移不难想,一个状态p ,在当前序列的末位加上数字j,新的状态是 newp=(p|((p<<j)&((1<<k)-1))|(1<<(j-1)));
可见 新的状态 newp>=p ,可以减一维空间。
#include <iostream>#include <stdio.h>#include <string.h>using namespace std;const int mod =1000000007;int n,k,l;int x;long long dp[1<<22];int t;int main(){ // freopen("in.txt","r",stdin); scanf("%d",&t); while (t--){ scanf("%d%d%d",&n,&k,&l); if (l>k) x=l-k; else x=0; l=min(l,k); memset(dp,0,sizeof(dp)); dp[0]=1; for (int i=0;i<n;i++){ for (int p=(1<<k);p>=0;p--) if (dp[p]>0) { int yy=dp[p]; dp[p]=(dp[p]*x)%mod; for (int j=0;j<=k;j++){ int newp; if (j==0) newp=p; else newp=(p|((p<<j)&((1<<k)-1))|(1<<(j-1))); dp[newp]+=yy; if (dp[newp]>=mod) dp[newp]-=mod; } } } int ans=0; for (int p=(1<<(k-1));p<(1<<k);p++) { ans+=dp[p]; if (ans>=mod) ans-=mod; } cout<<ans<<endl; } return 0;}
0 0
- HDU 4906 Our happy ending (状压DP)
- hdu 4906 Our happy ending(状压dp)
- HDU 4906 Our happy ending 状压DP
- HDU-4906 Our happy ending 状压DP
- HDU 4906 Our happy ending 状压DP
- hdu 4906 Our happy ending 状压dp
- hdu 4906 Our happy ending
- hdu 4906 Our happy ending (状态压缩dp)
- hdu 4906 Our happy ending 状态压缩dp
- hdu 4906 Our happy ending 状态压缩dp 较难
- hdu 4906 Our happy ending (多校第4场 )状压DP
- hdu4906 Our happy ending --- 状压dp
- hdu 4906——Our happy ending
- HDU 4906 Our happy ending 解题报告(递推)
- hdu4906 Our happy ending,状态压缩DP
- Our happy ending
- hdu4906Our happy ending 状压dp
- hdu 4906 Our happy ending 。神奇的状态转移方程,记录下
- Android开发图形处理创建一个图形的拷贝
- XML笔记
- kmp算法--求字符串子串--《数据结构》严蔚敏
- 网络拓扑距离的高效KNN查询 (中期总结)
- CountDownLatch使用说明
- HDU 4906 Our happy ending 状压DP
- Python3.3 Djando1.6.5 整合 MySQL Connectort/Python
- 51Talk-Level 7 Unit 1 L2
- 利用resteasy框架构建rest webservice----第六波:实现文件下载
- 用C语言宏定义寄存器地址解释 和 关键字 volatile
- SEO
- java之this关键字
- jQuery 参考手册 - 选择器
- Nand Flash和Nor Flash 启动区别