[LA7263]Today is a rainy day

有一个结论:肯定先用操作2(批量),再用操作1(个别)
(证明很简单,容易发现先修改后用操作2,一定不如先用操作2后再修改)
对$6^6=4w$的状态bfs,算出从初始状态转移到这个状态的最小代价
那么只需要暴力枚举所有状态,用1操作变过去的代价+bfs出来的代价取min即可

 1 #include
 2 using namespace std;
 3 #define hash has
 4 struct ji{
 5     int a[11];
 6 }a,b;
 7 queueq;
 8 int l,ans,vis[11],f[11][11],d[50005];
 9 char s1[205],s2[205];
10 int hash(ji a){
11     int s=1,ans=0;
12     for(int i=0;i<6;i++){
13         ans+=s*a.a[i];
14         s*=6;
15     }
16     return ans;
17 }
18 void bfs(ji a){
19     memset(d,-1,sizeof(d));
20     q.push(a);
21     d[hash(a)]=0;
22     while (!q.empty()){
23         a=q.front();
24         q.pop();
25         for(int i=0;i<6;i++)
26             for(int j=0;j<6;j++){
27                 b=a;
28                 for(int k=0;k<6;k++)
29                     if (b.a[k]==i)b.a[k]=j;
30                 if (d[hash(b)]<0){
31                     d[hash(b)]=d[hash(a)]+1;
32                     q.push(b);
33                 }
34             }
35     }
36 }
37 void dfs(int k){
38     if (k>5){
39         if (d[hash(a)]<0)return;
40         int s=l;
41         for(int i=0;i<6;i++)s-=f[a.a[i]][i];
42         ans=min(ans,s+d[hash(a)]);
43         return;
44     }
45     for(int i=0;i<6;i++){
46         a.a[k]=i;
47         dfs(k+1);
48     }
49 }
50 int main(){
51     for(int i=0;i<6;i++)a.a[i]=i;
52     bfs(a);
53     while (scanf("%s%s",s1,s2)!=EOF){
54         l=strlen(s1);
55         memset(f,0,sizeof(f));
56         for(int i=0;s1[i];i++)f[s1[i]-'1'][s2[i]-'1']++;
57         ans=0x3f3f3f3f;
58         dfs(0);
59         printf("%d\n",ans);
60     }
61 }
View Code

 

你可能感兴趣的:([LA7263]Today is a rainy day)