Felicity's Big Secret Revealed codeforces 757D(状压DP)

本文介绍了一种使用数位DP算法解决特定子集计数问题的方法。通过预处理数字组合并利用状态转移方程进行计算,最终求得所有合法子集的总数。该算法的时间复杂度为O(2^n*len*log_2(len))。

原题地址

题解

算法复杂度 \(O(2^{n}*len*log_2(len))\)

dp[i][S] 表示在第 \(i\) 个数后状态为 \(S\) 的时候的方案数.
num[i][j] 表示 \(i\)\(j\) 组成的数字.

①首先预处理出 num[i][j] 根据 \(len<=75\) 得出 \(max<=20\)
\(len_{max}<=5\) 所以 \(j-i<=5\);

②通过 \(len\) 计算出 \(n\)

③状态转移方程
\[dp[j][S|(1<<num[i][j]-1)+=dp[i][S];\]

④初值为
dp[i][0]=1 其中 \(i\)\(1 \to n-1\)

⑤计算 bin[] 数组
\(bin[i]=2^i-1\)

\[ans=\sum_{j=0}^n dp[bin[i]][j]\]

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=80,mod=1e9+7;
int n;
int x[maxn],num[maxn][maxn],limit=0;
int dp[76][(1<<20)+5];
int bin[22];
void readn()
{
    getchar();
    for(int i=1;i<=n;i++)
    x[i]=getchar()-'0';
}
void get_01()
{
    for(register int i=0;i<=n-1;i++)
    for(register int j=i+1;j<=n;j++)
    {
        int temp=1;
        for(register int k=j;k>=i+1;k--)
        {
            num[i][j]+=x[k]*temp;
            temp*=2;
            if(num[i][j]>22)
                break;
        }
    }
}
int main()
{
    int temp=2;
    for(int i=1;i<=21;i++)
    {
        bin[i]=temp-1;
        temp=temp*2;
    }
    limit=20;
    scanf("%d",&n);
    readn();
    get_01();
    for(register int i=0;i<=n;i++)dp[i][0]=1;
    for(register int j=0;j<=n-1;j++)
    for(register int i=0;i<=(1<<limit)-1;i++)
    {
    if(!dp[j][i]) continue;
    for(register int k=j+1;k<=n;k++)
    {
        if(num[j][k]>limit)break;
        if(num[j][k]==0)continue;
        dp[k][i|(1<<num[j][k]-1)]=(dp[k][i|(1<<num[j][k]-1)]+dp[j][i])%mod; 
    }
    }
    int sum=0;
    for(register int i=1;bin[i]<=(1<<limit)-1;i++)
    for(register int j=0;j<=n;j++)
    {
        sum+=dp[j][bin[i]];
        sum%=mod;
    }
    printf("%d\n",sum);
}

转载于:https://www.cnblogs.com/Harry-bh/p/8758998.html

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值