高位前缀和,求他的子集的和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; } }