本文主要是介绍膜法记录-------------------------思维(二进制),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
解析:
基本的贪心思路是先把能消灭一整行的次数用完,使得剩下的列尽量少,然后看看看剩下的列有多少个,和b比较一下大小。
n的范围很小,我们枚举2n种状态,看可以消掉a行,剩下来的判断是否满足消掉b列
#include<bits/stdc++.h>
using namespace std;
const int N=100,M=100005;
char s[N][M];
int t,n,m,a,b;
int main()
{scanf("%d",&t);while(t--){scanf("%d %d %d %d",&n,&m,&a,&b);for(int i=0;i<n;i++) cin>>s[i];int f=0;for(int i=0;i<(1<<n);i++){int cnt=0;//枚举行消除for(int j=0;j<n;j++) if((i>>j)&1) cnt++;if(cnt!=a) continue;int x=0;for(int j=0;j<m;j++){bool f1=0;for(int k=0;k<n;k++){//!((i>>k)&1) 是不用行消除,要用列消除if(!((i>>k)&1)&&s[k][j]=='*') {f1=1;break;}}if(f1==1) x++;}if(x<=b) {f=1;break;}}if(f==1) cout<<"yes"<<endl;else cout<<"no"<<endl;}}
这篇关于膜法记录-------------------------思维(二进制)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!