【问题标题】:counting by inclusion exclusion通过包含排除计数
【发布时间】:2017-03-17 21:13:47
【问题描述】:

请任何人帮助我找出hackerrank蜡烛计数问题中使用的位掩码(包含-排除原则方法) https://www.hackerrank.com/challenges/candles-2
我无法清楚地了解编辑代码中写的是什么。 您可以打开社论查看完整代码

int res = 0;
for(int mask = 0; mask < (1 << K); mask ++){
    memset(ft, 0, sizeof ft);
    int tmp = 0;
    for(int i = 0; i < N; i++){
        if((mask >> (C[i] - 1)) & 1){
            dp[i] = 1 + query(H[i] - 1); // BIT Query function
            madd(tmp, dp[i]);
            update(H[i], dp[i]); // BIT update function
        }
    }
    if(__builtin_popcount(mask) % 2 == K % 2){
        madd(res, tmp);
    } else {
        madd(res, mod - tmp);
    }
}

【问题讨论】:

    标签: dynamic-programming bitmask


    【解决方案1】:

    这是我可以从您发布的代码中得出的结论-

    1)if((mask &gt;&gt; (C[i] - 1)) &amp; 1) 检查ith 蜡烛的颜色是否已经存在(假设掩码用于存储已使用的颜色,因为其中没有提及代码)

    2)query(H[i] - 1)returns 可以从所有先前的蜡烛形成子序列的数量,因为它们都将是彩色的,因为当前蜡烛是第一个具有重复颜色的蜡烛,因此如果排除它,我们会得到'五颜六色的子序列'。

    3)update(H[i], dp[i]);用于移除所有不需要的蜡烛。

    示例- 如果我们的序列按顺序具有以下颜色 - 2 3 1 4 5 6 1 7 8 那么当我们到达第二个“1”时,数组中存储的颜色将只有 4 5 6 1,即“2 3 1”将被删除,“7 8”将被读取。

    4)madd(tmp, dp[i]);您的代码中没有足够的数据抱歉

    5)__builtin_popcount(mask) 计算掩码中的个数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 2012-03-23
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      相关资源
      最近更新 更多