http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1008
如果只有两个字符串的话 就直接用DP记忆化搜索 时间复杂度是 两者长度的乘积
这个题也可以DP记忆化搜索 因为所有字符串的的乘积最大为30000 再加上枚举最优 时间复杂度也不大
只要把n维 翻译成一维就可以记忆化了
不过为了方便 我用了map 来代替记忆化的功能
代码:
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<vector> #include<set> #include<map> #include<string> #include<stack> #include <iomanip> using namespace std; #define LL long long const int INF=0x3f3f3f3f; const int N=105; map<string, int >str; string s[N]; char a[N]; int I; bool OK(string k) { for (unsigned int i=1;i<k.size();++i) if (s[i][k[i]]!=s[i-1][k[i-1]]) return false ; return true ; } int dp(string k) { map<string, int >:: iterator it; it=str.find(k); if (it!=str.end()) return (it->second); str[k]=0; it=str.find(k); if (OK(k)) { it->second=1; unsigned int i; for (i=0;i<k.size();++i) if (k[i]==0) break ; else k[i]=k[i]-1; if (i==k.size()) it->second=it->second+dp(k); } else { for (unsigned int i=0;i<k.size();++i) { if (k[i]>0) { k[i]=k[i]-1; it->second=max(it->second,dp(k)); k[i]=k[i]+1; } } } return (it->second); } int main() { for ( int i=0;i<N;++i) a[i]=i; int T; cin>>T; while (T--) { int n; cin>>n; I=0; while (n--) { cin>>s[I]; if (s[I].size()>0) ++I; } string k; for ( int i=0;i<I;++i) k.insert(k.end(),a[s[i].size()-1]); str.clear(); cout<<dp(k)<<endl; } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 如何打造一个高并发系统?
· 《SpringBoot》EasyExcel实现百万数据的导入导出