码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • CF33b-B. String Problem


    题目链接

    题意:

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

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

    1. #include
    2. using namespace std;
    3. #define fi first
    4. #define se second
    5. #define ve vector
    6. #define all(x) (x).begin(), (x).end()
    7. #define rep(i, a, b) for (int i = a; i < b; i++)
    8. #define per(i, a, b) for (int i = a; i >= b; i--)
    9. using pi = pair<int, int>;
    10. inline int red() {
    11. int x;
    12. cin >> x;
    13. return x;
    14. }
    15. void solve() {
    16. string sa, sb;
    17. cin >> sa >> sb;
    18. int n = red();
    19. const int inf = 1e9;
    20. ve dp(26, ve<int>(26, inf));
    21. rep(i, 0, 26) {
    22. dp[i][i] = 0;
    23. }
    24. while (n--) {
    25. char c1, c2;
    26. int d;
    27. cin >> c1 >> c2 >> d;
    28. int x1 = c1 - 'a', x2 = c2 - 'a';
    29. dp[x1][x2] = min(dp[x1][x2], d);
    30. }
    31. if (sa.size() != sb.size()) {
    32. cout << "-1\n";
    33. return ;
    34. }
    35. rep(k, 0, 26) {
    36. rep(i, 0, 26) {
    37. rep(j, 0, 26) {
    38. dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
    39. }
    40. }
    41. }
    42. int len = sa.size(), sum = 0;
    43. string fin_str(len, 'a');
    44. rep(i, 0, len) {
    45. int x = sa[i] - 'a', y = sb[i] - 'a', mn = inf, cur;
    46. rep(j, 0, 26) {
    47. if (dp[x][j] != inf && dp[y][j] != inf && mn > dp[x][j] + dp[y][j]) {
    48. mn = dp[x][j] + dp[y][j];
    49. cur = j;
    50. }
    51. }
    52. if (mn == inf) {
    53. cout << "-1\n";
    54. return ;
    55. }
    56. sum += mn;
    57. fin_str[i] += cur;
    58. }
    59. cout << sum << '\n' << fin_str << '\n';
    60. }
    61. int main() {
    62. ios_base::sync_with_stdio(false);
    63. cin.tie(nullptr);
    64. int t = 1;
    65. while (t--) {
    66. solve();
    67. }
    68. return 0;
    69. }

  • 相关阅读:
    NumPy的广播机制
    实验4 SQL的复杂多表查询以及视图
    前端-vue基础53-组件化开发思想
    面试 高频面试题 基础 HTML CSS JS
    spring-boot 项目,nacos启动异常
    ElasticSearch使用_1_基本语法
    差分方程模型:国民总收入(GDP)的乘数-加速数模型
    CentOS7安装redis5.0并且搭建集群
    虚拟化、容器与Docker基本介绍以及安装部署(Docker 基本管理)
    故障排查:k8s节点不可用(rancher/hyperkube:v1.21.14-rancher1 Restarting)
  • 原文地址:https://blog.csdn.net/Hanknet/article/details/139768582
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号