词链—动态规划
词链(link)
题目描述
给定一个仅包含小写字母的英文单词表,其中每个单词最多包含50个字母。
如果一张由一个词或多个词组成的表中,每个单词(除了最后一个)都是排在它后面的单词的前缀,则称此表为一个词链。例如下面的单词组成了上个词链:
i
int
integer
而下面的单词不组成词链:
integer
intern
请在给定的单词表中取出一些词,组成最长的词链。最长的词链就是包含单词数最多的词链。
数据保证给定的单词表中,单词互不相同。
输入
第1行一个整数(n≤10000),表示单词表中单词数;
接下来n行,每行一个单词。
输出
一个整数,表示最长词链长度。
样例输入
5
i
integer
internet
intern
int
该题目类似最长上升子序列,dp搞一下就好了,string技巧很重要
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int maxn = 10005; inline bool slove(string s1, string s2){ string s3 = s1.substr(0, s2.size()); if(s3 == s2) return true; return false; } int main() { int n, dp[maxn]; string s[maxn]; scanf("%d", &n); for(int i = 0; i < n; i++){ cin >> s[i]; } for(int i = 0; i < n; i++){ dp[i] =1; } sort(s, s+n); for(int i = 0; i < n; i++){ for(int j = i-1; j >= 0; j--){ if(slove(s[i], s[j])){ dp[i] = dp[j] + 1; break; } } } printf("%d\n",*max_element(dp, dp+n)); return 0; }