#include<bits/stdc++.h>
using namespace std;
int n,m;
int tz[200],d[2100][2100];
int dp(int a,int s){
if(d[a][s]!=0x3f3f3f3f)return d[a][s];
int i,t,sum=0;
for(i=1;i<=m;i++)
if((tz[i]&s)==a)
sum++;
if(sum<=1)return d[a][s]=0;
int& ans=d[a][s];
ans=1e9;
for(i=1;i<=n;i++){
t=1<<(i-1);
if((s&t)==0)
ans=min(ans,max(dp(a|t,s|t),dp(a,s|t))+1);
}
return ans;
}
int main(){
int i,j;
char c;
while(scanf("%d%d",&n,&m)&&n&&m){
for(i=1;i<=m;i++){
scanf("\n");
tz[i]=0;
for(j=n;j>=1;j--){
scanf("%c",&c);
if(c-48)tz[i]+=1<<(j-1);
}
}
memset(d,0x3f,sizeof(d));
printf("%d\n",dp(0,0));
}
return 0;
}UVA 1252 Twenty Questions - ACM/ICPC Tokyo 2009
最新推荐文章于 2021-03-21 21:48:00 发布
本文介绍了一个使用C++实现的动态规划算法案例,通过一个具体的编程问题展示如何利用位运算和递归来求解最优解。代码中详细展示了状态转移方程的设计思路及其实现细节,对于理解动态规划原理及其在实际问题中的应用具有很好的参考价值。

879

被折叠的 条评论
为什么被折叠?



