zoukankan      html  css  js  c++  java
  • CF 33B String Problem

    对每个位置进行操作,求出最终变成相同字母的代价,然后把所有的位上代价加起来,使得总代价最小。res[i][j]表示将字母i+'a'和字母j+'a'变为相同的代价,设最终都变成字母k+'a',那么res[i][j]<?=dp[i][k]+dp[k][j],dp[i][k]表示将字母i+'a'最终变成j+'a'所需的代价,也就是点i到j的最短路径长度,Floyd—Warshall算法可解决。

    rec[i][j]记录i和j最终变成的字母-'a'.

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define N 100010
     4 #define M 30
     5 #define INF 9999
     6 #define min(a,b) ((a)>(b)?(b):(a))
     7 
     8 int dp[M][M],rec[M][M],res[M][M],vis[M][M];
     9 char s[N],t[N];
    10 
    11 int find(int i,int j)
    12 {
    13     if(vis[i][j])
    14         return res[i][j];
    15     int k,ans=res[i][j];
    16     vis[i][j]=vis[j][i]=1;
    17 
    18     for(k=0; k<26; k++)
    19         if(dp[i][k]+dp[j][k]<ans)
    20         {
    21             ans=dp[i][k]+dp[j][k];
    22             rec[j][i]=rec[i][j]=k;
    23         }
    24 
    25     return res[i][j]=res[j][i]=ans;
    26 }
    27 
    28 
    29 int main(void)
    30 {
    31     gets(s);
    32     gets(t);
    33     char ch1,ch2;
    34     int n,i,j,k;
    35     for(i=0; i<26; i++)
    36         for(j=0; j<26; j++)
    37             if(i==j)vis[i][j],rec[i][j]=j;
    38             else dp[i][j]=INF,res[i][j]=INF,rec[i][j]=-1;//将i!=j的点初始状态用INF表示为不可连通
    39 
    40     scanf("%d",&n);
    41     getchar();
    42 
    43     for(i=1; i<=n; i++)
    44     {
    45         int w;
    46         scanf("%c %c %d",&ch1,&ch2,&w);
    47         getchar();
    48         ch1-='a';
    49         ch2-='a';
    50             dp[ch1][ch2]=min(w,dp[ch1][ch2]);
    51     }
    52 
    53     for(k=0; k<26; k++)
    54         for(i=0; i<26; i++)
    55             for(j=0; j<26; j++)
    56                 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
    57 
    58     int te,sum=0;
    59     int len1=strlen(s);
    60     int len2=strlen(t);
    61     if(len1-len2)
    62         printf("-1
    ");
    63     else
    64     {
    65         for(i=0; i<len1; i++)
    66         {
    67             ch1=s[i]-'a';
    68             ch2=t[i]-'a';
    69             te=find(ch1,ch2);
    70             if(te>=INF)
    71                 return printf("-1
    "),0;
    72             else
    73             {
    74                 sum+=te;
    75                 s[i]=rec[ch1][ch2]+'a';
    76             }
    77         }
    78         printf("%d
    ",sum);
    79         puts(s);
    80     }
    81     return 0;
    82 }
  • 相关阅读:
    fescar中文官网
    mybatis 中的 update 返回值你真的明白吗
    数据库读写分离搭建
    git 回退各种场景操作
    听说noip2015有幻方
    noi2015的回忆和教训
    bzoj4026
    bzoj4127
    bzoj2119
    关于fft的一点总结
  • 原文地址:https://www.cnblogs.com/rootial/p/3228510.html
Copyright © 2011-2022 走看看