#132-(EZOI動態規劃練習)[動態規劃]單詞的劃分
阿新 • • 發佈:2018-12-16
Description
有一個很長的由小寫字母組成的字串。為了便於對這個字串進行分析,需要將它劃分成若干部分,每部分稱為一個單詞。出於減少分析量的目的,希望劃分出的單詞數越少越好。
Input
第1行1個字串,長度不超過100。 第2行1個整數n,表示單詞的個數,n<=100。 第3~n+2行,每行列出1個單詞。
Output
一行一個正整數,表示字串可以被劃分成的最少的單詞數。
Sample Input
realityour
5
real
reality
it
your
our
Sample Output
2
直接一個動規
#if 0 ispispisp 10 ispis pisp is pispis p 2 2 2 2 2 #endif #include <iostream> #include <string> #include <set> #define SIZE 110 #define INF 2e+09 using namespace std; set<string> st[SIZE]; string s, temp; int dp[SIZE]; int main(void) { int n, m, i, j; cin >> s; scanf("%d", &m); while (m--) { cin >> temp; st[temp.size()].insert(temp); } n = s.size(); for (i = 0; i < n; ++i) // 動態規劃過程 { dp[i] = INF; for (j = 1; j <= i + 1; ++j) { if (st[j].count(s.substr(i - j + 1, j))) // 如果這個子串出現在了單詞集合裡 { dp[i] = min(dp[i], (j == i + 1) ? 1 : dp[i-j] + 1); // 條件轉移方程 } } } printf("%d", dp[n-1]); return 0; }