题解 CF327E 【Axis Walking】

举报
yd_254844956 发表于 2023/11/21 00:28:15 2023/11/21
【摘要】 状压dp题,sum[i]为状态为i时的前缀和,dp[i]为到i为止方案数每次新的状态(sum[i]) = 仅有末尾1的状态 + 去掉末尾1的状态,而二者都在先前求过了,可以O(1)的求出sum[i] 的值而dp[i] 则要枚举每种情况,用lowbit取1而非枚举每一位来加速,将每种情况累加即可int N,K,No[2],a[(1<<24)+1];long long sum[(1<<24)+1...

状压dp题,sum[i]为状态为i时的前缀和,dp[i]为到i为止方案数

每次新的状态(sum[i]) = 仅有末尾1的状态 + 去掉末尾1的状态,而二者都在先前求过了,可以O(1)的求出sum[i] 的值

而dp[i] 则要枚举每种情况,用lowbit取1而非枚举每一位来加速,将每种情况累加即可

int N,K,No[2],a[(1<<24)+1];
long long sum[(1<<24)+1],dp[(1<<24)+1];
int lowbit(int Q){
    return Q&(-Q);
}
int main()
{
    N = Read();
    for(int i = 0; i < N; ++i)
    {
        a[i] = Read();
        sum[1<<i] = a[i];
    }
    K = Read();
    for(int i = 0; i < K; ++i)  //个数 <= 2 
        No[i] = Read();
    dp[0] = 1;  
     for(int i = 1; i < (1 << N); ++i)
     {
        sum[i] = sum[i-lowbit(i)] + sum[lowbit(i)];
        if(sum[i] == No[0] || sum[i] == No[1])
            continue;
        for(int j = i; j; j -= lowbit(j))
        {
            dp[i] += dp[i&~lowbit(j)];
            if(dp[i] > Mod) dp[i] -= Mod;
        }
     } 
     cout << dp[(1<<N)-1];
    return 0;
}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。