专题三 第十二题

1.题目编号:1002

2.简单题意:给出两个子串,依次比较子串得到两个子串相等的字符的最大长度,即最长公共子序列。

3.解题思路形成过程:在动态规划的专题,就想到用动态规划的方法去做,首先要找子问题,假设有两个字符串a=a0,a1,a2,...am-1,b=b0,b1,b2...bn-1。如果am-1==bn-1,则当前最长公共子序列为a0,a1,...am-2与b0,b1,b2...bn-2的最长公共子序列的长度加1;如果am-1!=bn-1,则最长公共子序列为max(a0,a1,...am-2与b0,b1,b2...bn-1的公共子序列,a0,a1...am-1和b0,b1,b2...bn-2的子序列)就得到递归表示:if(a[i-1]==b[j-1]){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}

4.感悟:这种题就像是模板,一个会了,只要遇到题就想着找状态转移方程组=.=

5.AC的代码:

#include<iostream>

#include<cstring>

using namespace std;

char a[1000];

char b[1000];

int dp[1000][1000];

int max(int l,int s){

if (l>=s)

return l;

else

return s;

}

int main(){

while(cin>>a>>b){

int a1=strlen(a);

int b1=strlen(b);

memset(dp,0,sizeof(dp));

for(int i=1;i<a1+1;i++){

for(int j=1;j<b1+1;j++){

if(a[i-1]==b[j-1]){

dp[i][j]=dp[i-1][j-1]+1;

}

else{

dp[i][j]=max(dp[i-1][j],dp[i][j-1]);

}

}

}

cout<<dp[a1][b1]<<endl;

}

return 0;

}

原题:

Problem Description

A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = &lt;x1, x2, ..., xm&gt; another sequence Z = &lt;z1, z2, ..., zk&gt; is a subsequence of X if there exists a
strictly increasing sequence &lt;i1, i2, ..., ik&gt; of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = &lt;a, b, f, c&gt; is a subsequence of X = &lt;a, b, c, f, b, c&gt; with index sequence &lt;1, 2, 4, 6&gt;. Given two sequences
X and Y the problem is to find the length of the maximum-length common subsequence of X and Y. <br>The program input is from a text file. Each data set in the file contains two strings representing the given sequences. The sequences are separated by any number
of white spaces. The input data are correct. For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line. <br>

Sample Input

abcfbc abfcab
programming contest
abcd mnp

Sample Output

4
2
0



时间: 2024-11-17 04:27:55

专题三 第十二题的相关文章

经典算法题每日演练——第二十二题 奇偶排序

原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个“奇偶排序”说起吧,不过这个排序还是蛮有意思的,严格来说复杂度是O(N2),不过在多核的情况下,可以做到 N2 /(m/2)的效率,这里的m就是待排序的个数,当m=100,复杂度为N2 /50,还行把,比冒泡要好点,因为重点是解决问题的奇思妙想. 下面我们看看这个算法是怎么描述的,既然是奇偶,肯定跟位数有

经典算法题每日演练——第十二题 线段树

原文:经典算法题每日演练--第十二题 线段树 这一篇我们来看树状数组的加强版线段树,树状数组能玩的线段树一样可以玩,而且能玩的更好,他们在区间求和,最大,平均 等经典的RMQ问题上有着对数时间的优越表现. 一:线段树 线段树又称"区间树”,在每个节点上保存一个区间,当然区间的划分采用折半的思想,叶子节点只保存一个值,也叫单元节点,所 以最终的构造就是一个平衡的二叉树,拥有CURD的O(lgN)的时间. 从图中我们可以清楚的看到[0-10]被划分成线段的在树中的分布情况,针对区间[0-N],最多有

《剑指offer》第三十二题III:之字形打印二叉树

// 面试题32(三):之字形打印二叉树 // 题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺 // 序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印, // 其他行以此类推. #include <cstdio> #include "BinaryTree.h" #include <stack> void Print(BinaryTreeNode* pRoot) { //整体思路和前两道题很像,先进先出变后进先出 if

【leetcode 简单】第三十二题 买卖股票的最佳时机Ⅱ

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 .   随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(

《剑指offer》第三十二题I:不分行从上往下打印二叉树

// 面试题32(一):不分行从上往下打印二叉树 // 题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印. #include <cstdio> #include "BinaryTree.h" #include <deque> void PrintFromTopToBottom(BinaryTreeNode* pRoot) { if (pRoot == nullptr) return; std::deque<BinaryTreeNod

leecode第一百四十二题(环形链表II)

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *detectCycle(ListNode *head) { if(head==NULL) return NULL; ListNode *fast_no

LeetCode第二十二题-创建n对括号

Generate Parentheses 问题简介: 给定n对括号,编写一个函数来生成格式正确的括号的所有组合. 举例: 给定n = 2,解集是: [ “()()”, “(())” ] 给定n = 3,解集是: [ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ] 解法一: 通过递归将所有符合的情况添加到集合中,限制条件: 1.左括号的数量最大为n 2.当前字符串中的右括号数量不能大于左括号 解法二: 因为n个括号共2n个字符,也就是索引0到2

《剑指offer》第二十二题(链表中倒数第k个结点)

// 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, // 从头结点开始它们的值依次是1.2.3.4.5.6.这个链表的倒数第3个结点是 // 值为4的结点. //O(n)的解法:维护两个指针,让A走B前头,前K步,A到头,B就是解了,但是这个问题在于程序鲁棒性 #include <iostream> #include "List.h&q

LeetCode第五十二题-N皇后二(JAVA)

N-Queens II 问题简介:给定一个n*n的棋盘,求解如何将n个皇后放置在棋盘上, 保证其之间不互相攻击,即给定一个整数 n,返回所有不同的解决方案的个数 注:例如下图为n = 8 时的一个解 举例: 输入: 4 输出:2 解释: [ [".Q…", // Solution 1 “…Q”, “Q…”, “…Q.”], ["…Q.", // Solution 2 “Q…”, “…Q”, “.Q…”] ] 解法一: 利用递归,首先从第一行元素开始,逐行扫描判断,主