题目描述:

从一个给定的串中删去(不一定连续地删去)0个或0个以上的字符,剩下地字符按原来顺序组成的串。例如:“ ”,“a”,“xb”,“aaa”,“bbb”,“xabb”,“xaaabbb”都是串“xaaabbb”的子序列。(例子中的串不包含引号。)

编程求N个非空串的最长公共子序列的长度。限制:2<=N<=100;N个串中的字符只会是数字0,1,…,9或小写英文字母a,b,…,z;每个串非空且最多含100个字符;N个串的长度的乘积不会超过30000。

输入格式:

文件第1行是一个整数T,表示测试数据的个数(1<=T<=10)。接下来有T组测试数据。各组测试数据的第1行是一个整数Ni,表示第i组数据中串的个数。各组测试数据的第2到N+1行中,每行一个串,串中不会有空格,但行首和行末可能有空格,这些空格当然不算作串的一部分。

输出格式:

输出T行,每行一个数,第i行的数表示第i组测试数据中Ni个非空串的最长公共子序列的长度。

输入样例:

1
3
ab
bc
cd

输出样例:

0

参考代码:

#include<stdio.h>
#include<string.h>
int max(a,b){return a>b?a:b;}
int n,len[101],dp[30000];
char s[100][100];
int LCS(int *x)
{int a,b,i,j;for(i=1;i<=n;i++){if(x[i]==0)return 0;}for(a=x[n]-1,i=n-1;i>=1;i--){a=a*len[i]+x[i]-1;}if(dp[a]>=0)return dp[a];for(i=2;i<=n;i++){if(s[1][x[1]-1]!=s[i][x[i]-1])break;}if(i>n){for(j=1;j<=n;j++){x[j]--;}b=LCS(x)+1;for(j=1;j<=n;j++){x[j]++;}}else{b=0;for(j=1;j<=n;j++){x[j]--;int t=LCS(x);b=max(b,t);x[j]++;}}dp[a]=b;return b;
}
int main()
{int t,i,m[100];scanf("%d",&t);while(t--){scanf("%d",&n);for(i=1;i<=n;i++){scanf("%s",s[i]);len[i]=m[i]=strlen(s[i]);}memset(dp,-1,sizeof(dp));printf("%d\n",LCS(m));}return 0;
}

7-1 最长公共子序列 (20 分)相关推荐

  1. 7-2 最长公共子序列 (10 分)(思路加详解)

    一:题目 给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少. 输入格式: 第一行包含两个整数N和M.1≤N,M≤1000 第二行包含一个长度为N的字符串,表 ...

  2. 5-3 最长连续递增子序列 (20分)

    5-3 最长连续递增子序列 (20分) 给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列.例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8 ...

  3. 7-181 最长连续递增子序列 (20 分)

    7-181 最长连续递增子序列 (20 分) 给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列.例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4, ...

  4. 动态规划(分梨、最长公共子序列)

    1.分梨: 题目描述 小明非常喜欢吃梨,有一天他得到了ACMCLUB送给他的一筐梨子.由于他比较仗义,就打算把梨子分给好朋友们吃.现在他要把M个梨子放到N个盘子里面(我们允许有的盘子为空),你能告诉小 ...

  5. 动态规划算法解最长公共子序列LCS问题

    动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...

  6. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

    最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...

  7. 动态规划1--最长公共子序列

    动态规划1--最长公共子序列 一.动态规划 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地采用把大问题分解成子问题,并 综合子问题的解导出大问题的解的方法,问题求解耗时 ...

  8. C++——《算法分析与设计》实验报告——最长公共子序列问题

    实验名称: 最长公共子序列问题 实验地点: 实验目的: 理解动态规划算法的概念: 掌握动态规划算法的基本要素: 掌握设计动态规划算法的步骤: 通过应用范例学习动态规划算法的设计技巧与策略: 实验原理 ...

  9. C++——《算法分析》实验贰——最长公共子序列问题

    实验目的: 1.理解动态规划算法的概念: 2.掌握动态规划算法的基本要素: 3.掌握设计动态规划算法的步骤: 4.通过应用范例学习动态规划算法的设计技巧与策略: 实验原理: 动态规划是运筹学的一个分支 ...

最新文章

  1. 1所更名、3所新设!山西4所高校获批复
  2. 洛谷P1832 A+B Problem(再升级)
  3. 剑指offer23 从上往下打印二叉树
  4. 跳出圈子易,再入围城难,重新学编程,且学且珍惜
  5. 在python中,用正则表达式提取多层括号中最外层括号包含的内容
  6. 计算机二级access模考软件_计算机二级考前通关大礼包来啦!各科目模考软件、视频教程,更有往年真题、最新考纲等打包送!...
  7. 性能测试工具Locust的使用----TaskSet类~~task任务嵌套
  8. 混沌思维模型实战课课件分享
  9. CSS 居中 可随着浏览器变大变小而居中
  10. get和post用法和区别总结
  11. HDU 6232 2017 哈尔滨 Confliction
  12. CMU 15213:attack实验
  13. [移动端开发]到底什么是WebView?
  14. 台式计算机开机慢,台式电脑开机很慢的解决办法
  15. 绝了!超全面的Java调优方案,我司已用7年,并得到验证!(万能通用)
  16. 全民打怪兽全民战场恐惧流伙伴实测
  17. 下载 | 数学分析八讲(修订版)
  18. 阿里云实人认证有什么特点
  19. 异常检测---离群点
  20. 03-Mybatis的关键核心类说明

热门文章

  1. tkinter将图标写入py文件
  2. java使用jacob操作word文档
  3. firewalld 指定IP访问某端口
  4. linux看磁盘是sas还是sata吗,SAS和SATA硬盘傻傻分不清?看这里
  5. 移动端适配 - 小结
  6. Google Chrome插件开发-Context Menus
  7. 网吧台式计算机配置,2017网吧电脑配置
  8. 实验三 mysql数据库与表的创建_实验二 数据库和表的创建与管理
  9. 密西西比河谷州立大学:Android应用程序开发(三)
  10. 求图像边界点坐标c语言,三、Windows图像处理—画点和线(边框函数)