高位前缀和,求他的子集的和https://ac.nowcoder.com/acm/contest/4784/A

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
char s[40][maxn];
int f[1<<21];

int main()
{
    int T;
    cin>>T;
    while(T--){
    int n,m,a,b;
    scanf("%d%d%d%d",&n,&m,&a,&b);
        for(int i=0;i<(1<<n);i++)
            f[i]=0;
    for(int i=0;i<n;i++)
        scanf("%s",s[i]);
        
    for(int i=0;i<m;i++)
    {
        int t=0;
        for(int j=0;j<n;j++)
        {
            if(s[j][i]=='*'){
                t|=(1<<j);
            }
        }
        f[t]++;
    }
        
    for(int j = 0; j < n; j++)
        for(int i = 0; i < 1 << n; i++)
            if(i >> j & 1)
                f[i] += f[i ^ (1 << j)];

    int ans=0;
    for(int i=0;i<(1<<n);i++)
    {
        int num=0;
        for(int j=0;j<n;j++)
            if((i&(1<<j))!=0)
                num++;
        
        if(num<=a){
//            cout<<i<<" "<<dp[i]<<endl;
            ans=max(ans,f[i]);
        }
    }
        
        if(m-ans<=b)
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    
    }
    
}
原文地址:https://www.cnblogs.com/King-of-Dark/p/12552395.html