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