• HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)


    虽然是一道还是算简单的DP,甚至不用滚动数组也能AC,数据量不算很大。

    对于N个数,每个数只存在两个状态,取 和 不取。

    容易得出状态转移方程:

    dp[i][j] = dp[i - 1][j ^ a[i]] + dp[i - 1][j];
    

    dp[i][j] 的意思是,对于数列 中前 i 个数字,使得 XOR 和恰好为 j 的方案数

    状态转移方程中的 dp[i - 1][j] 即表示当前这个数字不取, dp[i - 1][j ^ a[i]] 表示当前这个数字要取。

    这道题还是要好好理解阿!

    source code :

    //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
    #include <stdio.h>
    #include <iostream>
    #include <cstring>
    #include <cmath>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <algorithm>
    #define ll long long
    #define Max(a,b) (((a) > (b)) ? (a) : (b))
    #define Min(a,b) (((a) < (b)) ? (a) : (b))
    #define Abs(x) (((x) > 0) ? (x) : (-(x)))
    
    using namespace std;
    
    const int INF = 0x3f3f3f3f;
    
    int dp[2][1 << 20];
    int a[41];
    
    int main(){
        int i, j, k, T, n, m, numCase = 0;
        scanf("%d",&T);
        while(T--){
            scanf("%d%d",&n,&m);
            for(i = 1; i <= n; ++i) scanf("%d", a + i);
            memset(dp, 0, sizeof(dp));
            dp[0][0] = 1;
            for(i = 1; i <= n; ++i){
                for(j = 0; j < (1 << 20); ++j){
                    dp[i % 2][j] = dp[(i - 1) % 2][j ^ a[i]] + dp[(i - 1) % 2][j];
                }
            }
            long long ans = 0;
            for(i = m; i < (1 << 20); ++i){
                ans += dp[n % 2][i];
            }
            printf("Case #%d: %I64d
    ",++numCase, ans);
        }
        return 0;
    }
  • 相关阅读:
    python之新手一看就懂的小说爬虫
    Mysql与Oracle区别
    Java面试2018常考题目汇总(一)(转)
    单例式的优缺点和使用场景
    设计模式之单例模式通俗理解
    IntelliJ Idea 最常用快捷键
    sql语句基础和提升
    Tomcat 安装配置
    Git基本常用命令
    Java练手题
  • 原文地址:https://www.cnblogs.com/wushuaiyi/p/4143220.html
Copyright © 2020-2023  润新知