词链—动态规划

 词链(link)

题目描述

给定一个仅包含小写字母的英文单词表,其中每个单词最多包含50个字母。
如果一张由一个词或多个词组成的表中,每个单词(除了最后一个)都是排在它后面的单词的前缀,则称此表为一个词链。例如下面的单词组成了上个词链:
i
int
integer
而下面的单词不组成词链:
integer
intern
请在给定的单词表中取出一些词,组成最长的词链。最长的词链就是包含单词数最多的词链。
数据保证给定的单词表中,单词互不相同。

输入

第1行一个整数(n≤10000),表示单词表中单词数;
接下来n行,每行一个单词。

输出

一个整数,表示最长词链长度。

样例输入

5
i
integer
internet
intern
int


该题目类似最长上升子序列,dp搞一下就好了,string技巧很重要
#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;
}
View Code

 




posted on 2016-07-11 21:32  disppr  阅读(355)  评论(0编辑  收藏  举报