7-1 最长公共子序列 (20 分)
题目描述:
从一个给定的串中删去(不一定连续地删去)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 分)相关推荐
- 7-2 最长公共子序列 (10 分)(思路加详解)
一:题目 给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少. 输入格式: 第一行包含两个整数N和M.1≤N,M≤1000 第二行包含一个长度为N的字符串,表 ...
- 5-3 最长连续递增子序列 (20分)
5-3 最长连续递增子序列 (20分) 给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列.例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8 ...
- 7-181 最长连续递增子序列 (20 分)
7-181 最长连续递增子序列 (20 分) 给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列.例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4, ...
- 动态规划(分梨、最长公共子序列)
1.分梨: 题目描述 小明非常喜欢吃梨,有一天他得到了ACMCLUB送给他的一筐梨子.由于他比较仗义,就打算把梨子分给好朋友们吃.现在他要把M个梨子放到N个盘子里面(我们允许有的盘子为空),你能告诉小 ...
- 动态规划算法解最长公共子序列LCS问题
动态规划算法解LCS问题 作者 July 二零一零年十二月三十一日 本文参考:微软面试100题系列V0.1版第19.56题.算法导论.维基百科. 第一部分.什么是动态规划算法 ok,咱们先来了解下什么 ...
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...
- 动态规划1--最长公共子序列
动态规划1--最长公共子序列 一.动态规划 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地采用把大问题分解成子问题,并 综合子问题的解导出大问题的解的方法,问题求解耗时 ...
- C++——《算法分析与设计》实验报告——最长公共子序列问题
实验名称: 最长公共子序列问题 实验地点: 实验目的: 理解动态规划算法的概念: 掌握动态规划算法的基本要素: 掌握设计动态规划算法的步骤: 通过应用范例学习动态规划算法的设计技巧与策略: 实验原理 ...
- C++——《算法分析》实验贰——最长公共子序列问题
实验目的: 1.理解动态规划算法的概念: 2.掌握动态规划算法的基本要素: 3.掌握设计动态规划算法的步骤: 4.通过应用范例学习动态规划算法的设计技巧与策略: 实验原理: 动态规划是运筹学的一个分支 ...
最新文章
- 1所更名、3所新设!山西4所高校获批复
- 洛谷P1832 A+B Problem(再升级)
- 剑指offer23 从上往下打印二叉树
- 跳出圈子易,再入围城难,重新学编程,且学且珍惜
- 在python中,用正则表达式提取多层括号中最外层括号包含的内容
- 计算机二级access模考软件_计算机二级考前通关大礼包来啦!各科目模考软件、视频教程,更有往年真题、最新考纲等打包送!...
- 性能测试工具Locust的使用----TaskSet类~~task任务嵌套
- 混沌思维模型实战课课件分享
- CSS 居中 可随着浏览器变大变小而居中
- get和post用法和区别总结
- HDU 6232 2017 哈尔滨 Confliction
- CMU 15213:attack实验
- [移动端开发]到底什么是WebView?
- 台式计算机开机慢,台式电脑开机很慢的解决办法
- 绝了!超全面的Java调优方案,我司已用7年,并得到验证!(万能通用)
- 全民打怪兽全民战场恐惧流伙伴实测
- 下载 | 数学分析八讲(修订版)
- 阿里云实人认证有什么特点
- 异常检测---离群点
- 03-Mybatis的关键核心类说明