hdu 4906 状压dp

原创 2016年05月31日 00:03:34

题意:给出n,k<=20,L<=10^9 问能不能通过不大于L的数组成一个含n个数的序列使得能从这个序列中挑出几个数的和为k,求满足条件序列的个数

题解:看到k<20可以用sum的状态做状压dp的状态

状态转移方程next=(1<<(p-1))|j|((j<<p)&SIZE); dp[next]=(dp[next]+v)%mod;

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll __int64
using namespace std;
const ll mod=1e9+7;
ll dp[1<<21],v;
int main()
{
    int T,n,k,l,MIN,SIZE,i,j,p;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d",&n,&k,&l);
        memset(dp,0,sizeof(dp));
        dp[0]=1;//赋初值不然没法启动
        SIZE=(1<<k)-1;//最大状态
        ll MIN=min(l,k);//因为大于k的值是没用的可以在后面直接加上去
        for(i=1;i<=n;i++){//因为要加n个数这里枚举次数
            for(j=SIZE;j>=0;j--){//倒着枚举状态是类似背包一样防止重复加
                v=dp[j];
                if(v==0)continue;
                for(p=1;p<=MIN;p++){
                    int next=(1<<(p-1))|j|((j<<p)&SIZE);//加上数p后的状态1.p本身2.j本身3.j的每一位加上p后的状态
                    dp[next]=(dp[next]+v)%mod;
                }
                if(k<l)dp[j]=(dp[j]+(ll)v*(l-k))%mod;//剩下部分直接加上去不知道为什么看有些blog没限制条件答案也是对的
            }//是数据太弱吗
        }
        ll ans=0;
        for(i=0;i<=SIZE;i++)
            if(i&(1<<(k-1))) (ans+=dp[i])%=mod;
        printf("%I64d\n",ans);
    }
    return 0;
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu3001Travelling (状态压缩DP,三进制)

Travelling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
  • u010372095
  • u010372095
  • 2014年08月10日 22:01
  • 1416

hdu4284之状态压缩dp

倒计时第5天!——携程编程大赛,你报名了吗? Travel Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 3...
  • xingyeyongheng
  • xingyeyongheng
  • 2014年04月02日 09:30
  • 1267

HDU 4272LianLianKan 2012长春网络赛F题(思维) 暴力,dfs可以水过,正解是状态压缩dp

LianLianKan Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota...
  • opm777
  • opm777
  • 2013年07月25日 13:15
  • 1951

hdu 4906 Our happy ending 状压dp

题意:一个数量为n的序列,每个数0
  • weixin_36571742
  • weixin_36571742
  • 2017年08月06日 15:25
  • 117

hdu 4906 Our happy ending (多校第4场 )状压DP

题目大意: 如果一个串的字串
  • u011561033
  • u011561033
  • 2014年08月04日 18:02
  • 406

hdu 4906 状态压缩DP

这题比赛的时候没能做出来,看的点击打开链接的思路
  • hzh_0000
  • hzh_0000
  • 2014年08月01日 22:49
  • 560

hdu 4906 Our happy ending 状态压缩dp

#include #include #include #include #include using namespace std; #define maxn 1
  • firenet1
  • firenet1
  • 2014年08月04日 21:04
  • 600

状态dp小结 (hdu4804 hdu4856 hdu3681 poj3311 hdu3001 cf453B hdu4906 zoj3802)

hdu4804 会的人说是水题,不会的是
  • u011663071
  • u011663071
  • 2014年07月26日 11:14
  • 848

HDU 4906(状态压缩题目)

本题目虽然是个简单的状态压缩规划题目: 但是逆向的递推式即刷表有一个很明显的优化,但是正向的话就不会有,就因为这个剪纸有没有变可以导致超时,也是醉了。 很明显d[i][s] 代表用i个位置生成生成...
  • playwfun
  • playwfun
  • 2015年11月25日 11:54
  • 207

hdu4906:3-idiots【FFT】

题意给出n个正整数,求从中任选3个数(下标不重复),求以这三个数为长度的边能构成三角形的概率。...
  • OIljt12138
  • OIljt12138
  • 2017年03月05日 20:42
  • 187
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 4906 状压dp
举报原因:
原因补充:

(最多只允许输入30个字)