hdu 4901 The Romantic Hero

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define ll long long
const ll mod=1e9+7;
const int maxa=1024+10;
const int maxn=1000+10;
ll dp1[maxn][maxa];
ll dp2[maxn][maxa];
ll dp11[maxn][maxa];
int a[maxn];
void init(){
    memset(dp1,0,sizeof(dp1));
    memset(dp2,0,sizeof(dp2));
    memset(dp11,0,sizeof(dp11));
}

void add(ll& n,ll c){
    n+=c;
    n%=mod;
}
int main()
{
    int n;
    int T;
    cin>>T;
    while(T--){
            cin>>n;
            for(int i=1;i<=n;i++)
               cin>>a[i];
            init();
            for(int i=1;i<=n;i++){
                    dp1[i][a[i]]++;
                    dp2[i][a[i]]++;
                    dp11[i][a[i]]++;
            }

            for(int i=2;i<n;i++){
                    for(int j=0;j<1024;j++){
                    if(dp1[i-1][j]){
                       add(dp1[i][j],dp1[i-1][j]);
                       add(dp1[i][j^a[i]],dp1[i-1][j]);
                       add(dp11[i][j^a[i]],dp1[i-1][j]);

                    }
                    }
            }

            for(int i=n-1;i>1;i--){
                    for(int j=0;j<1024;j++){
                        if(dp2[i+1][j]){
                        add(dp2[i][j],dp2[i+1][j]);
                        add(dp2[i][j&a[i]],dp2[i+1][j]);
                        }
                    }
            }
            ll ans=0;
            for(int i=1;i<n;i++){
                    for(int j=0;j<1024;j++){
                            if(dp11[i][j]&&dp2[i+1][j]){
                                 add(ans,dp11[i][j]*dp2[i+1][j]);
                            }

                    }
            }
            cout<<ans<<endl;
    }
    return 0;
}







题目链接: 点击打开链接


题意:一些数中的两个非空集合S,T,要求S集合数最大标号小于T集合最小标号,问有多少种可能使S集合数xor和等于T集合数and和。


dp题。dp1[i][j]表示从1到i的数中有多少种组合使xor和为j;dp2[i][j]表示从n到i的数中有多少种组合使and和为j,这样当dp1[i][j]==dp2[i+1][j]时相等的方案数即为两数相乘。但是这样求和的时候会有很多重复的(虽然i改变了但是某方案依然包含于原来的两个集合中),解决方法是引入dp11数组,dp11[i][j]表示从1到i的数中包含第i个数有多少种组合使xor和为j,这样就排除了重复的情况。


代码:


你可能感兴趣的:(dp,动态规划)