hdu 4901 The Romantic Hero (dp+背包问题)

题意:

有n个数,从n个数中选出两个集合s和集合t,保证原序列中,集合s中的元素都在

集合t中元素的左边。且要求集合s中元素做抑或运算的值与集合t中元素做与运算的

值相等。问能选出多少种这样的集合s和t。

算法:

左右dp。

用dp[i][j]表示前i个数 做抑或运算得到j的方法数。最后一个值取不取到都不一定。

故为背包的问题。右边也是一样。

枚举时可能出现重复。枚举到第i个和枚举第i+1个可能重复。所以要枚举一个中间值。

这个中间值是归到s集的,因为抑或支持逆运算,而与是不支持的。

所以最后dp方程应该改为  前i个数一定包含第i个做抑或得到值j的方法数,即s[i][j]。

那么s[i][j] = dp[i-1][j^a[i]]。

右边也是做与运算,但要注意下标。

然后取long long应该在乘法之前,否则乘法运算后可能已经溢出,再做long long 就没意义了。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

const int mod = 1000000000+7;
typedef long long ll;
int a[1010];
int dp[1010][1025],dp1[1010][1025],s[1010][1025];

int main()
{
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        memset(dp,0,sizeof(dp));
        dp[0][0] = 1;
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<1024;j++)
            {
                dp[i][j] = dp[i-1][j]+dp[i-1][j^a[i]];
                if(dp[i][j]>=mod)
                    dp[i][j] -= mod;
            }
            for(int j=0;j<1024;j++)
                s[i][j] = dp[i-1][j^a[i]];
        }
        memset(dp1,0,sizeof(dp1));
        for(int i=n;i>=1;i--)
        {
            dp1[i][a[i]]++;
            for(int j=0;j<1024;j++)
            {
                dp1[i][j&a[i]] = (dp1[i][j&a[i]]+dp1[i+1][j])%mod;
                dp1[i][j] = (dp1[i][j]+dp1[i+1][j])%mod;
            }
        }
        int cnt = 0;
        for(int k=1;k<=n-1;k++)
        {
            for(int j=0;j<1024;j++)
            {
                cnt = (cnt+(ll)s[k][j]*dp1[k+1][j])%mod;
                if(cnt>=mod) cnt-=mod;
            }
        }
        printf("%d\n",cnt);
    }
    return 0;
}

hdu 4901 The Romantic Hero (dp+背包问题)

时间: 2024-10-23 07:15:33

hdu 4901 The Romantic Hero (dp+背包问题)的相关文章

HDU 4901 The Romantic Hero(DP)

HDU 4901 The Romantic Hero 题目链接 题意:给定一个序列,要求找一个分界点,然后左边选一些数异或和,和右边选一些数且和相等,问有几种方法 思路:dp,从左往右和从右往左dp,求出异或和且的个数,然后找一个分界点,使得一边必须在分界点上,一边随意,然后根据乘法原理和加法原理计算 代码: #include <cstdio> #include <cstring> typedef __int64 ll; const int N = 1024; const int

HDU 4901 The Romantic Hero(二维dp)

题目大意:给你n个数字,然后分成两份,前边的一份里面的元素进行异或,后面的一份里面的元素进行与.分的时候按照给的先后数序取数,后面的里面的所有的元素的下标一定比前面的大.问你有多上种放元素的方法可以使得前面异或的值和后面与的值相等. dp[x][y] 表示走到第x步,得到y这个数字一共有多少种方法. 但是需要注意这里得分一下,不能直接用dp数组存种数,你需要分一下从上一层过来的次数,和这一层自己可以到达的次数.然后取和的时候前后两个集合的种数进行乘法,注意边乘边取余. 顺便给一组数据: 4 3

2014多校第四场1005 || HDU 4901 The Romantic Hero (DP)

题目链接 题意 :给你一个数列,让你从中挑选一些数组成集合S,挑另外一些数组成集合T,要求是S中的每一个数在原序列中的下标要小于T中每一个数在原序列中下标.S中所有数按位异或后的值要与T中所有的数按位与的值相同,问能找出多少符合要求的组合. 思路 :比赛的时候有点没有头绪,后来二师兄想出了状态转移方程,YN又改了很多细节,最后才A的.总之是个别扭的DP..... 一开始是 _xor[i][j^a[i]] += _xor[i-1][j] :j 的下一个状态 就是异或上a[i],这个数组所代表的意思

hdu 4901 The Romantic Hero(计数dp)2014多校训练第4场1005

The Romantic Hero                                                                               Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description There is an old country and the king fell in lov

hdoj 4901 The Romantic Hero DP hdoj 4902 Nice boat 线段树

惨遭丽洁乱虐..这一场也是比得乱七八糟的,4902本是丽洁定义比较难的题,结果数据随机的,被许多暴力水过了..4905考察的是四边形不等式优化,但是这道题的dp方程实际上不满足该优化的条件..朴素的o(n^3)会超时,所以这题目前是没有正解了..我还写了个这题的贪心,强度挺高,可以对大概一半数据,错的误差也只有个位数,还揪出官方第五个数据..朴素dp和贪心跑这个数据都比官方数据多了1,也就证明这题不满足四边形不等式优化的条件.. http://acm.hdu.edu.cn/showproblem

hdu 4901 The Romantic Hero 计数dp,位计算

The Romantic Hero Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1128    Accepted Submission(s): 469 Problem Description There is an old country and the king fell in love with a devil. The d

HDU 4901 The Romantic Hero 题解——S.B.S.

The Romantic Hero Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1675    Accepted Submission(s): 705 Problem Description There is an old country and the king fell in love with a devil. The de

HDU 4901 The Romantic Hero

The Romantic Hero Time Limit: 3000MS   Memory Limit: 131072KB   64bit IO Format: %I64d & %I64u Description 开头背景介绍无用 There is an old country and the king fell in love with a devil. The devil always asks the king to do some crazy things. Although the k

HDU - 4901 The Romantic Hero(dp)

https://vjudge.net/problem/HDU-4901 题意 给n个数,构造两个集合,使第一个集合的异或和等于第二个集合的相与和,且要求第一个集合的元素下标都小于第二个集合的元素下标.问方案数 分析 dp来做.dp1[i][j]表示0~i的元素异或和为j的个数.dp2[i][j]表示i~n-1的元素相与和为j的个数.注意状态转移时要同时计算第i个数参与或不参与的情况,且dp1的第一维不能取到n-1,类似的,dp2的第一维不能取0.统计最终答案时需要合并,那么怎么才能防止重复呢?这