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;
}
相关推荐
白云千载尽44 分钟前
leetcode 912.排序数组
算法·leetcode·职场和发展
哆啦刘小洋1 小时前
Tips:预封装约束的状态定义
算法
代码充电宝1 小时前
LeetCode 算法题【简单】290. 单词规律
java·算法·leetcode·职场和发展·哈希表
Juan_20121 小时前
P1040题解
c++·算法·动态规划·题解
Onesoft%J1ao1 小时前
C++竞赛递推算法-斐波那契数列常见题型与例题详解
c++·算法·动态规划·递推·信息学奥赛
以己之2 小时前
NC313 两个数组的交集
算法·哈希算法
Brookty2 小时前
【算法】前缀和
java·学习·算法·前缀和·动态规划
And_Ii2 小时前
LeetCode 3397. 执行操作后不同元素的最大数量
数据结构·算法·leetcode
额呃呃2 小时前
leetCode第33题
数据结构·算法·leetcode
隐语SecretFlow2 小时前
【隐语SecretFlow用户案例】亚信科技构建统一隐私计算框架探索实践
科技·算法·安全·隐私计算·隐私求交·开源隐私计算