CF33b-B. String Problem

题目链接

题意:

给定两个字符串,给出n个op。对于每个op可以将一种字母转变为另一个字母,代价为d。需要求出通过上面的变化,让两个字符串相等的最小代价的字符串

题解:

先用Floyd计算出一个字母变换为另一个字母的最小代价,

接下来我们考虑某一个位置,假设初始字符分别是c1,c2,最后变成了

c0,那么总成本为dp[c1][c0] + dp[c2][c0];也就是c1变成c0的最小成本加上

c2变成c0的最小成本。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define ve vector
#define all(x) (x).begin(), (x).end()
#define rep(i, a, b) for (int i = a; i < b; i++)
#define per(i, a, b) for (int i = a; i >= b; i--)
using pi = pair<int, int>;

inline int red() {
    int x;
    cin >> x;
    return x;
}

void solve() {
    string sa, sb;
    cin >> sa >> sb;
    int n = red(); 
    const int inf = 1e9;
    ve dp(26, ve<int>(26, inf));
    rep(i, 0, 26) {
        dp[i][i] = 0;
    }
    while (n--) {
        char c1, c2;
        int d;
        cin >> c1 >> c2 >> d;
        int x1 = c1 - 'a', x2 = c2 - 'a';
        dp[x1][x2] = min(dp[x1][x2], d);
    }
    if (sa.size() != sb.size()) {
        cout << "-1\n";
        return ;
    }
    rep(k, 0, 26) {
        rep(i, 0, 26) {
            rep(j, 0, 26) {
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
            }
        }
    }

    int len = sa.size(), sum = 0;
    string fin_str(len, 'a');
    rep(i, 0, len) {
        int x = sa[i] - 'a', y = sb[i] - 'a', mn = inf, cur;
        rep(j, 0, 26) {
            if (dp[x][j] != inf && dp[y][j] != inf && mn > dp[x][j] + dp[y][j]) {
                mn = dp[x][j] + dp[y][j];
                cur = j;
            }
        }
        if (mn == inf) {
            cout << "-1\n";
            return ;
        }
        sum += mn;
        fin_str[i] += cur;
    }
    cout << sum << '\n' << fin_str << '\n';
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int t = 1;
    while (t--) {
        solve();
    }

    return 0;
}
相关推荐
瓦特what?39 分钟前
关于C++的#include的超超超详细讲解
java·开发语言·数据结构·c++·算法·信息可视化·数据挖掘
楽码1 小时前
自动修复GoVet:语言实现对比
后端·算法·编程语言
杰克尼2 小时前
415. 字符串相加
算法
lifallen2 小时前
JCTools 无锁并发队列基础:ConcurrentCircularArrayQueue
java·开发语言·数据结构·算法
来自天蝎座的孙孙3 小时前
洛谷P1595讲解(加强版)+错排讲解
python·算法
GawynKing3 小时前
图论(5)最小生成树算法
算法·图论·最小生成树
试剂界的爱马仕3 小时前
胶质母细胞瘤对化疗的敏感性由磷脂酰肌醇3-激酶β选择性调控
人工智能·科技·算法·机器学习·ai写作
打不了嗝 ᥬ᭄4 小时前
Linux 信号
linux·开发语言·c++·算法
张子夜 iiii4 小时前
机器学习算法系列专栏:主成分分析(PCA)降维算法(初学者)
人工智能·python·算法·机器学习
一匹电信狗4 小时前
【C++】异常详解(万字解读)
服务器·c++·算法·leetcode·小程序·stl·visual studio