题目描述

思路
数组定义: dp[i] 表示原字符串的下标0 ~ i 的个数初始化: dp[0] = 0; 不考虑下标是0的情况状态转移方程:枚举字符串数组a[k] (k: 1 ~ n)if (可以连接)dp[i] = min(dp[i], dp[i - a[k].size()] - 1);答案: dp[Ans_Cin.size()]
Code
#include <iostream>
#include <string>
#include <vector>
#include <climits>
using namespace std;typedef string Word_t;
int main() {Word_t Ans_Cin;cin >> Ans_Cin; int n; cin >> n; vector<Word_t> words(n + 1); for (int i = 1; i <= n; ++i) cin >> words[i]; vector<int> dp(Ans_Cin.size() + 1, INT_MAX - 10);dp[0] = 0;int Size = Ans_Cin.size(); for (int i = 1; i <= Size; i++){for (int j = 1; j <= n; j++){int len = words[j].size();if (i - len >= 0){string TempGetStr = Ans_Cin.substr(i - len, len); if (TempGetStr == words[j]) dp[i] = min(dp[i], dp[i - len] + 1);}}}cout << dp[Size];return 0;
}