题面
题意
给出x=1111B,y=110011B,z=1010101B,输出一个由x,y,z组成的字符串使其结果为给出的数,且最短,若长度相同,则输出字典序最小的一个.
方法
首先按符号的优先级来划分等级:
0 – (),!
1 – &
2 – |
dp[i][j]表示优先级为i,值为j时的最优表达式.
因此,dp[0][x]=x,dp[0][y]=y,dp[0][z]=z.
一开始想到的做法是BFS,将已知状态通过&(x或y或z),|(x或y或z)来更新.
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
using namespace std;
int n,k,k1,k2,a,b,x=0b00001111,y=0b00110011,z=0b01010101;
string dp[5][300],tmp,tmp2;
bool in[3000];
queue<int>que;
//0 -- (),!
//1 -- &
//2 -- |
bool operator < (string u,string v)
{
if(u==""||v=="") return v=="";
if(u.size()!=v.size()) return u.size()<v.size();
int i;
for(i=0; i<u.size(); i++)
{
if(u[i]!=v[i]) return u[i]<v[i];
}
return 0;
}
int main()
{
int i,j;
dp[0][x]='x';
dp[0][y]='y';
dp[0][z]='z';
que.push(x);
que.push(y);
que.push(z);
in[x]=in[y]=in[z]=1;
for(; !que.empty();)
{
k=que.front();
k1=k/300;
k2=k%300;
in[que.front()]=0;
que.pop();
// !
a=k2^255;
if(!k1)
{
if(dp[k1][k2].size()==1)
{
tmp='!'+dp[k1][k2];
if(tmp<dp[0][a])
{
dp[0][a]=tmp;
if(!in[a])
{
in[a]=1;
que.push(a);
}
}
}
}
else
{
tmp="!("+dp[k1][k2]+')';
if(tmp<dp[0][a])
{
dp[0][a]=tmp;
if(!in[a])
{
in[a]=1;
que.push(a);
}
}
}
// &
// x
a=k2&x;
if(k1<1)
{
if("x&"+dp[k1][k2] < dp[k1][k2]+"&x") tmp="x&"+dp[k1][k2];
else tmp=dp[k1][k2]+"&x";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else if(k>1)
{
if("x&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&x") tmp="x&("+dp[k1][k2]+')';
else tmp='('+dp[k1][k2]+")&x";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else
{
if("x&("+dp[k1][k2]+')' < dp[k1][k2]+"&x") tmp="x&("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"&x";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
// y
a=k2&y;
if(k1<1)
{
if("y&"+dp[k1][k2] < dp[k1][k2]+"&y") tmp="y&"+dp[k1][k2];
else tmp=dp[k1][k2]+"&y";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else if(k>1)
{
if("y&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&y") tmp="y&("+dp[k1][k2]+')';
else tmp='('+dp[k1][k2]+")&y";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else
{
if("y&("+dp[k1][k2]+')' < dp[k1][k2]+"&x") tmp="y&("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"&y";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
//z
a=k2&z;
if(k1<1)
{
if("z&"+dp[k1][k2] < dp[k1][k2]+"&z") tmp="z&"+dp[k1][k2];
else tmp=dp[k1][k2]+"&z";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else if(k>1)
{
if("z&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&z") tmp="z&("+dp[k1][k2]+')';
else tmp='('+dp[k1][k2]+")&z";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else
{
if("z&("+dp[k1][k2]+')' < dp[k1][k2]+"&z") tmp="z&("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"&z";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
// |
//x
a=k2|x;
if(k1==2)
{
if("x|("+dp[k1][k2]+')' < dp[k1][k2]+"|x") tmp="x|("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"|x";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
else
{
if("x|"+dp[k1][k2] < dp[k1][k2]+"|x") tmp="x|"+dp[k1][k2];
else tmp=dp[k1][k2]+"|x";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
//y
a=k2|y;
if(k1==2)
{
if("y|("+dp[k1][k2]+')' < dp[k1][k2]+"|y") tmp="y|("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"|y";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
else
{
if("y|"+dp[k1][k2] < dp[k1][k2]+"|y") tmp="y|"+dp[k1][k2];
else tmp=dp[k1][k2]+"|y";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
//z
a=k2|z;
if(k1==2)
{
if("z|("+dp[k1][k2]+')' < dp[k1][k2]+"|z") tmp="z|("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"|z";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
else
{
if("z|"+dp[k1][k2] < dp[k1][k2]+"|z") tmp="z|"+dp[k1][k2];
else tmp=dp[k1][k2]+"|z";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
}
cin>>n;
for(i=1; i<=n; i++)
{
scanf("%d",&k);
k1=0;
for(j=0; j<=7; j++)
{
k1+=k%10*(1 << j);
k/=10;
}
if(dp[0][k1]<dp[1][k1]&&dp[0][k1]<dp[2][k1])
{
cout<<dp[0][k1];
}
else if(dp[1][k1]<dp[2][k1])
{
cout<<dp[1][k1];
}
else
{
cout<<dp[2][k1];
}
puts("");
}
}
可是11001110就过不了,寻找原因后发现无法在原状态上进行|!x 的操作,于是就天真地增加了&(!x或!y或!z),|(!x或!y或!z)6种操作.
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
using namespace std;
int n,k,k1,k2,a,b,x=0b00001111,y=0b00110011,z=0b01010101;
string dp[5][300],tmp,tmp2;
bool in[3000];
queue<int>que;
//0 -- (),!
//1 -- &
//2 -- |
bool operator < (string u,string v)
{
if(u==""||v=="") return v=="";
if(u.size()!=v.size()) return u.size()<v.size();
int i;
for(i=0; i<u.size(); i++)
{
if(u[i]!=v[i]) return u[i]<v[i];
}
return 0;
}
int main()
{
int i,j;
dp[0][x]='x';
dp[0][y]='y';
dp[0][z]='z';
que.push(x);
que.push(y);
que.push(z);
in[x]=in[y]=in[z]=1;
for(; !que.empty();)
{
k=que.front();
k1=k/300;
k2=k%300;
in[que.front()]=0;
que.pop();
// !
a=k2^255;
if(!k1)
{
if(dp[k1][k2].size()==1)
{
tmp='!'+dp[k1][k2];
if(tmp<dp[0][a])
{
dp[0][a]=tmp;
if(!in[a])
{
in[a]=1;
que.push(a);
}
}
}
}
else
{
tmp="!("+dp[k1][k2]+')';
if(tmp<dp[0][a])
{
dp[0][a]=tmp;
if(!in[a])
{
in[a]=1;
que.push(a);
}
}
}
// &
// x
a=k2&x;
if(k1<1)
{
if("x&"+dp[k1][k2] < dp[k1][k2]+"&x") tmp="x&"+dp[k1][k2];
else tmp=dp[k1][k2]+"&x";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else if(k>1)
{
if("x&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&x") tmp="x&("+dp[k1][k2]+')';
else tmp='('+dp[k1][k2]+")&x";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else
{
if("x&("+dp[k1][k2]+')' < dp[k1][k2]+"&x") tmp="x&("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"&x";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
// y
a=k2&y;
if(k1<1)
{
if("y&"+dp[k1][k2] < dp[k1][k2]+"&y") tmp="y&"+dp[k1][k2];
else tmp=dp[k1][k2]+"&y";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else if(k>1)
{
if("y&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&y") tmp="y&("+dp[k1][k2]+')';
else tmp='('+dp[k1][k2]+")&y";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else
{
if("y&("+dp[k1][k2]+')' < dp[k1][k2]+"&x") tmp="y&("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"&y";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
//z
a=k2&z;
if(k1<1)
{
if("z&"+dp[k1][k2] < dp[k1][k2]+"&z") tmp="z&"+dp[k1][k2];
else tmp=dp[k1][k2]+"&z";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else if(k>1)
{
if("z&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&z") tmp="z&("+dp[k1][k2]+')';
else tmp='('+dp[k1][k2]+")&z";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else
{
if("z&("+dp[k1][k2]+')' < dp[k1][k2]+"&z") tmp="z&("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"&z";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
// !x
a=k2&(255^x);
if(k1<1)
{
if("!x&"+dp[k1][k2] < dp[k1][k2]+"&!x") tmp="!x&"+dp[k1][k2];
else tmp=dp[k1][k2]+"&!x";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else if(k>1)
{
if("!x&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&!x") tmp="!x&("+dp[k1][k2]+')';
else tmp='('+dp[k1][k2]+")&!x";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else
{
if("!x&("+dp[k1][k2]+')' < dp[k1][k2]+"!&x") tmp="!x&("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"&!x";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
// !y
a=k2&(255^y);
if(k1<1)
{
if("!y&"+dp[k1][k2] < dp[k1][k2]+"&!y") tmp="!y&"+dp[k1][k2];
else tmp=dp[k1][k2]+"&!y";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else if(k>1)
{
if("!y&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&!y") tmp="!y&("+dp[k1][k2]+')';
else tmp='('+dp[k1][k2]+")&!y";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else
{
if("!y&("+dp[k1][k2]+')' < dp[k1][k2]+"&!y") tmp="!y&("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"&!y";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
//!z
a=k2&(255^z);
if(k1<1)
{
if("!z&"+dp[k1][k2] < dp[k1][k2]+"&!z") tmp="!z&"+dp[k1][k2];
else tmp=dp[k1][k2]+"&!z";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else if(k>1)
{
if("!z&("+dp[k1][k2]+')' < '('+dp[k1][k2]+")&!z") tmp="!z&("+dp[k1][k2]+')';
else tmp='('+dp[k1][k2]+")&!z";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
else
{
if("!z&("+dp[k1][k2]+')' < dp[k1][k2]+"&!z") tmp="!z&("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"&!z";
if(tmp<dp[1][a])
{
dp[1][a]=tmp;
if(!in[a+300])
{
in[a+300]=1;
que.push(a+300);
}
}
}
// |
//x
a=k2|x;
if(k1==2)
{
if("x|("+dp[k1][k2]+')' < dp[k1][k2]+"|x") tmp="x|("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"|x";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
else
{
if("x|"+dp[k1][k2] < dp[k1][k2]+"|x") tmp="x|"+dp[k1][k2];
else tmp=dp[k1][k2]+"|x";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
//y
a=k2|y;
if(k1==2)
{
if("y|("+dp[k1][k2]+')' < dp[k1][k2]+"|y") tmp="y|("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"|y";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
else
{
if("y|"+dp[k1][k2] < dp[k1][k2]+"|y") tmp="y|"+dp[k1][k2];
else tmp=dp[k1][k2]+"|y";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
//z
a=k2|z;
if(k1==2)
{
if("z|("+dp[k1][k2]+')' < dp[k1][k2]+"|z") tmp="z|("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"|z";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
else
{
if("z|"+dp[k1][k2] < dp[k1][k2]+"|z") tmp="z|"+dp[k1][k2];
else tmp=dp[k1][k2]+"|z";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
//!x
a=k2|(255^x);
if(k1==2)
{
if("!x|("+dp[k1][k2]+')' < dp[k1][k2]+"|!x") tmp="!x|("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"|!x";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
else
{
if("!x|"+dp[k1][k2] < dp[k1][k2]+"|!x") tmp="!x|"+dp[k1][k2];
else tmp=dp[k1][k2]+"|!x";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
//!y
a=k2|(255^y);
if(k1==2)
{
if("!y|("+dp[k1][k2]+')' < dp[k1][k2]+"|!y") tmp="!y|("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"|!y";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
else
{
if("!y|"+dp[k1][k2] < dp[k1][k2]+"|!y") tmp="!y|"+dp[k1][k2];
else tmp=dp[k1][k2]+"|!y";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
//!z
a=k2|(255^z);
if(k1==2)
{
if("!z|("+dp[k1][k2]+')' < dp[k1][k2]+"|!z") tmp="!z|("+dp[k1][k2]+')';
else tmp=dp[k1][k2]+"|!z";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
else
{
if("!z|"+dp[k1][k2] < dp[k1][k2]+"|!z") tmp="!z|"+dp[k1][k2];
else tmp=dp[k1][k2]+"|!z";
if(tmp<dp[2][a])
{
dp[2][a]=tmp;
if(!in[a+600])
{
in[a+600]=1;
que.push(a+600);
}
}
}
}
cin>>n;
for(i=1; i<=n; i++)
{
scanf("%d",&k);
k1=0;
for(j=0; j<=7; j++)
{
k1+=k%10*(1 << j);
k/=10;
}
// cout<<dp[0][k1]<<" "<<dp[1][k1]<<" "<<dp[2][k1];
//*
if(dp[0][k1]<dp[1][k1]&&dp[0][k1]<dp[2][k1])
{
cout<<dp[0][k1];
}
else if(dp[1][k1]<dp[2][k1])
{
cout<<dp[1][k1];
}
else
{
cout<<dp[2][k1];
}
puts("");
//*/
}
}
可惜过不了01001001,后来发现这种做法无法应对|(…)的形式,因而不得不改变做法.
正确做法是不断地暴力更新状态,将一下几个操作循环进行:
1.将优先级为2的通过加上括号变为优先级为0的:
dp[i][0]=min(dp[i][0], ‘(’+dp[i][2]+’)’ );
为了进行"非"运算
2.枚举并进行"非"运算:
dp[i ^ 255][0]=min(dp[i ^ 255][0], ’ ! '+dp[i][0] );
3.将优先级为0的变为优先级为1的:
dp[i][1]=min(dp[i][1], dp[i][0] );
为了进行"与"运算,且优先级1能做的0都能做
4.枚举并进行"与"运算
dp[i&j][0]=min(dp[i&j][0], dp[i][0]+’&’+dp[j][0] );
5.将优先级为0的变为优先级为1的:
dp[i][2]=min(dp[i][2], dp[i][1] );
为了进行"或"运算,作用与3相似
6.枚举并进行"或"运算
dp[i | j][0]=min(dp[i | j][0], dp[i][0]+’|’+dp[j][0] );
当6个操作均无法操作时就停止循环,每次输入一个数后取3个优先级种的最小值即可.
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int n,k,k1,k2,a,b,x=0b00001111,y=0b00110011,z=0b01010101;
string dp[5][300],tmp,tmp2;
bool have;
//0 -- (),!
//1 -- &
//2 -- |
bool operator < (string u,string v)
{
if(u==""||v=="") return v=="";
if(u.size()!=v.size())return u.size()<v.size();
int i;
for(i=0; i<u.size(); i++)
{
if(u[i]!=v[i]) return u[i]<v[i];
}
return 0;
}
int main()
{
int i,j;
dp[0][x]='x';
dp[0][y]='y';
dp[0][z]='z';
for(have=1; have;)
{
have=0;
// ()
for(i=0; i<=255; i++)
{
if(dp[2][i]=="") continue;
tmp='('+dp[2][i]+')';
if(tmp<dp[0][i])
{
have=1;
dp[0][i]=tmp;
}
}
// !
for(i=0; i<=255; i++)
{
if(dp[0][i]=="") continue;
tmp='!'+dp[0][i];
if(tmp<dp[0][i^255])
{
have=1;
dp[0][i^255]=tmp;
}
}
// &
for(i=0; i<=255; i++)
{
if(dp[0][i]=="") continue;
if(dp[0][i]<dp[1][i])
{
have=1;
dp[1][i]=dp[0][i];
}
}
for(i=0; i<=255; i++)
{
if(dp[1][i]=="") continue;
for(j=0; j<=255; j++)
{
if(dp[1][j]=="") continue;
tmp=dp[1][i]+'&'+dp[1][j];
if(tmp<dp[1][i&j])
{
have=1;
dp[1][i&j]=tmp;
}
}
}
// |
for(i=0; i<=255; i++)
{
if(dp[1][i]=="") continue;
if(dp[1][i]<dp[2][i])
{
have=1;
dp[2][i]=dp[1][i];
}
}
for(i=0; i<=255; i++)
{
if(dp[2][i]=="") continue;
for(j=0; j<=255; j++)
{
if(dp[2][j]=="") continue;
tmp=dp[2][i]+'|'+dp[2][j];
if(tmp<dp[2][i|j])
{
have=1;
dp[2][i|j]=tmp;
}
}
}
}
cin>>n;
for(i=1; i<=n; i++)
{
scanf("%d",&k);
k1=0;
for(j=0; j<=7; j++)
{
k1+=k%10*(1 << j);
k/=10;
}
if(dp[0][k1]<dp[1][k1]&&dp[0][k1]<dp[2][k1])
{
cout<<dp[0][k1];
}
else if(dp[1][k1]<dp[2][k1])
{
cout<<dp[1][k1];
}
else
{
cout<<dp[2][k1];
}
puts("");
}
}