http://acm.hdu.edu.cn/showproblem.php?pid=2280
View Code
1 #include <cstdio> 2 using namespace std; 3 4 const int INF=110; 5 int n,m=5; 6 int d[1010][40]; 7 int mz[1010]; 8 void dfs(int p,int s,int t,int c,int r) 9 { 10 if(p>=m) 11 { 12 if(c<d[r][t]) d[r][t]=c; 13 return; 14 } 15 if(p<4 && ((s>>p)&1)==0 && ((t>>p)&3)==0) 16 dfs(p+1,s|(1<<p),t|(3<<p),c,r); 17 if(p<4 && ((s>>p)&3)==0 && ((t>>p)&3)==0) 18 dfs(p+1,s|(3<<p),t|(3<<p),c,r); 19 if(p<4 && ((s>>p)&3)==0) 20 dfs(p+1,s|(3<<p),t,c,r); 21 if(((s>>p)&1)==0 && ((t>>p)&1)==0) 22 dfs(p+1,s|(1<<p),t|(1<<p),c,r); 23 if(p>0 && (((s>>p)&1)==0) && (t>>(p-1)&3)==0) 24 dfs(p+1,s|(1<<p),t|(3<<(p-1)),c,r); 25 if(p<4 && ((s>>p)&3)==0 && ((t>>p)&1)==0) 26 dfs(p+1,s|(3<<p),t|(1<<p),c,r); 27 if(p<4 && ((s>>p)&3)==0 && ((t>>p)&2)==0) 28 dfs(p+1,s|(3<<p),t|(2<<p),c,r); 29 if(((s>>p)&1)==1) dfs(p+1,s,t,c,r); 30 else dfs(p+1,s|(1<<p),t,c+1,r); 31 } 32 int f(int x) 33 { 34 int cnt=0; 35 x+=32; 36 for(int i=0;i<5;i++) 37 { 38 if((x&1)==1) x>>=1; 39 else 40 { 41 x>>=1; 42 if((x&1)==1) cnt++; 43 x>>=1; 44 i++; 45 } 46 } 47 return cnt; 48 } 49 int main() 50 { 51 int c; 52 while(~scanf("%d%d",&n,&c)) 53 { 54 for(int i=0;i<n;i++) 55 { 56 char str[10]; 57 scanf("%s",str); 58 int s=0; 59 for(int j=0;j<5;j++) s=(s<<1)+str[j]-'0'; 60 mz[i]=s; 61 } 62 for(int i=0;i<n;i++) 63 for(int j=0;j<32;j++) d[i][j]=INF; 64 d[0][mz[0]]=0; 65 for(int i=0;i<n-1;i++) 66 for(int j=0;j<32;j++) if(d[i][j]<=c) 67 dfs(0,j,mz[i+1],d[i][j],i+1); 68 bool flag=false; 69 for(int i=0;i<32;i++) 70 if(d[n-1][i]+f(i)<=c) flag=true; 71 if(flag) printf("YES\n"); 72 else printf("NO\n"); 73 } 74 return 0; 75 }