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;
}
相关推荐
Word码1 分钟前
leetcode260.只出现一次的数字III
算法
MM_MS13 分钟前
Halcon图像采集助手、ROI操作和画图、ROI实现区域与轮廓之间的相互转换、区域的交集差集取反
图像处理·人工智能·数码相机·算法·目标检测·计算机视觉·视觉检测
智者知已应修善业29 分钟前
【输出一个N*N的01矩阵,表示最后的汉字点阵图】2024-10-22
c语言·数据结构·c++·经验分享·笔记·算法·矩阵
uesowys42 分钟前
华为OD算法开发指导-二级索引
数据结构·算法·华为od
a程序小傲1 小时前
高并发下如何防止重复下单?
java·开发语言·算法·面试·职场和发展·状态模式
uoKent1 小时前
c++中的封装、继承与多态
开发语言·c++·算法
爱喝可乐的老王1 小时前
机器学习监督学习模型--朴素贝叶斯
人工智能·算法·机器学习
啊阿狸不会拉杆2 小时前
《机器学习》完结篇-总结
人工智能·算法·机器学习·计算机视觉·ai·集成学习·ml
Sheep Shaun2 小时前
C++11核心特性详解:从右值引用到现代C++编程
开发语言·数据结构·c++·算法
云深麋鹿2 小时前
三.栈和队列
开发语言·数据结构·c++·算法