大厂笔试题
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
1.7 KiB

  1. /*
  2. c++
  3. s串s串是空串 t
  4. :
  5. 1.s串的开头添加一个字符p
  6. 2.s串的末尾添加一个字符p
  7. 3.s串的开头添加一个s串的子串 q
  8. 4.s串的末尾添加一个s串的子串 q
  9. s串
  10. s串变到t串的最小花费?
  11. :
  12. t
  13. p,q
  14. 1
  15. bbcabc
  16. 3 1
  17. 11
  18. s串先变成"c”,目前花费为3.
  19. s串变成"bc",6
  20. s串变成bca,9.
  21. s串变成"bcabc",10.
  22. s串变成bbcabc",目前花费为11.
  23. 11
  24. */
  25. #include <iostream>
  26. #include <vector>
  27. #include <string>
  28. using namespace std;
  29. int main() {
  30. // 读取输入
  31. string t;
  32. cin >> t;
  33. int p, q;
  34. cin >> p >> q;
  35. int n = t.size();
  36. vector<int> dp(n + 1, INT_MAX); // dp数组,初始为最大值
  37. dp[0] = 0; // 空串到空串的花费为0
  38. // 进行动态规划计算
  39. for (int i = 1; i <= n; ++i) {
  40. // 操作1和操作2: 添加一个字符
  41. dp[i] = dp[i - 1] + p;
  42. // 操作3和操作4: 添加一个子串
  43. for (int j = 0; j < i; ++j) {
  44. // 如果t的子串t[j:i]可以在s中形成,花费为q
  45. string sub = t.substr(j, i - j);
  46. if (t.substr(0, j).find(sub) != string::npos || t.substr(0, i - sub.size()).find(sub) != string::npos) {
  47. dp[i] = min(dp[i], dp[j] + q);
  48. }
  49. }
  50. }
  51. // 输出最小花费
  52. cout << dp[n] << endl;
  53. return 0;
  54. }