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.
|
|
/*
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; }
|