大厂笔试题
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

/*
c++实现以下问题:
小红一开始有 s串,s串是空串。她想获得一个字符串 t。
小红有四种操作:
1.在s串的开头添加一个字符,花费为p。
2.在s串的末尾添加一个字符,花费为p。
3.在s串的开头添加一个s串的子串,花费为 q。
4.在s串的末尾添加一个s串的子串,花费为 q。
每次操作都是基于当前的s串,有对应的花费。
小红想知道从s串变到t串的最小花费,你能帮帮她吗?
输入描述:
第一行输入一个字符串t,仅包含小写字符。
第二行输入两个正整数 p,q。
示例 1
输入
bbcabc
3 1
输出
11
说明:
s串先变成"c”,目前花费为3.
s串变成"bc",目前花费为6。
s串变成”bca”,目前花费为9.
s串变成"bcabc",目前花费为10.
s串变成“bbcabc",目前花费为11.
因此输出11。
*/
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
// 读取输入
string t;
cin >> t;
int p, q;
cin >> p >> q;
int n = t.size();
vector<int> dp(n + 1, INT_MAX); // dp数组,初始为最大值
dp[0] = 0; // 空串到空串的花费为0
// 进行动态规划计算
for (int i = 1; i <= n; ++i) {
// 操作1和操作2: 添加一个字符
dp[i] = dp[i - 1] + p;
// 操作3和操作4: 添加一个子串
for (int j = 0; j < i; ++j) {
// 如果t的子串t[j:i]可以在s中形成,花费为q
string sub = t.substr(j, i - j);
if (t.substr(0, j).find(sub) != string::npos || t.substr(0, i - sub.size()).find(sub) != string::npos) {
dp[i] = min(dp[i], dp[j] + q);
}
}
}
// 输出最小花费
cout << dp[n] << endl;
return 0;
}