当前位置: 首页> 科技> 互联网 > CF33b-B. String Problem

CF33b-B. String Problem

时间:2025/7/10 8:26:19来源:https://blog.csdn.net/Hanknet/article/details/139768582 浏览次数:0次

题目链接

题意:

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

题解:
先用Floyd计算出一个字母变换为另一个字母的最小代价,
接下来我们考虑某一个位置,假设初始字符分别是c1,c2,最后变成了 
c0,那么总成本为dp[c1][c0] + dp[c2][c0];也就是c1变成c0的最小成本加上 
c2变成c0的最小成本。

#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;
}

关键字:CF33b-B. String Problem

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: