/* 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 #include #include using namespace std; int main() { // 读取输入 string t; cin >> t; int p, q; cin >> p >> q; int n = t.size(); vector 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; }