输入:
5 i int integer intern internet
输出:
4
题意: 有N个字符串, N <= 2000 字符串长度小于75。并且是按字典序排列好, 没有相同的。如果一个串是另一个串的前缀,那么就能构成相连的词汇。 问从中选出一些串。 能够成多长的词汇长度。
思路: 一维背包
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> using namespace std; //最长上升子序列 const int V = 2000 + 50; const int MaxN = 80 + 5; const int mod = 1000000000 + 7; int N, dp[V], ans; //dp[i] 表示 第i串最多有的前缀数 char ch[V][MaxN]; bool f(int i, int j) { int p; if(strlen(ch[i]) <= strlen(ch[j])) return false; for(p = 0; ch[j][p]; ++p) if(ch[i][p] != ch[j][p]) break; if(ch[j][p] != '\0') return false; return true; } int main() { int i, j; scanf("%d", &N); for(i = 0; i < N; ++i) scanf("%s", ch[i]); memset(dp, 0, sizeof(dp)); for(i = 1; i < N; ++i) for(j = i - 1; j >= 0; --j) if(f(i, j)) dp[i] = max(dp[i], dp[j] + 1); for(i = 0; i < N; ++i) ans = max(ans, dp[i]); printf("%d\n", ans + 1); }

本文详细介绍了如何使用C++语言通过一维背包算法解决字符串匹配问题,具体涉及到输入多个字符串,根据字典序进行排序,判断串是否为另一串的前缀,最终求出最长连续词汇长度的过程。
379

被折叠的 条评论
为什么被折叠?



