题意与分析

很简单:求最长公共子序列。
注意子序列与子串的差别:一个不连续一个连续。一份比较好的参考资料见:https://segmentfault.com/a/1190000002641054

状态转移方程是这样的:
设dp[i][j]dp[i][j]为a串1~i、b串1~j中的最长的公共子序列,则

dp[i][j]={dp[i−1][j−1]+1,  max(dp[i−1][j],dp[i][j−1]),  a[i]=b[j],a[i]≠b[j]dp[i][j]={dp[i−1][j−1]+1,  a[i]=b[j],max(dp[i−1][j],dp[i][j−1]),  a[i]≠b[j]

类似地,最长公共子串是这样求的:
定义dp[i][j]dp[i][j]为以i、j为末尾的最长子串,有

dp[i][j]={dp[i−1][j−1]+1,  0,  a[i]=b[j],a[i]≠b[j]dp[i][j]={dp[i−1][j−1]+1,  a[i]=b[j],0,  a[i]≠b[j]

稍微不同地,多个字符串的公共子串/子序列求法如下:
https://blog.csdn.net/luxiaoxun/article/details/7915962
https://blog.csdn.net/liang5630/article/details/8095404
以后补题/训练的时候再仔细探讨。

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#define MP make_pair
#define PB push_back
#define fi first
#define se second
#define ZERO(x) memset((x), 0, sizeof(x))
#define ALL(x) (x).begin(),(x).end()
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define per(i, a, b) for (int i = (a); i >= (b); --i)
#define QUICKIO \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
using namespace std; template<typename T>
T read()
{
T tmp; cin>>tmp;
return tmp;
} int dp[1005][1005];
string a,b; int solve(int i,int j)
{
if(i<0 || j<0) return 0;
if(dp[i][j]!=-1)
return dp[i][j];
if(a[i]==b[j])
{
return dp[i][j]=solve(i-1,j-1)+1;
}
else
{
return dp[i][j]=max(solve(i-1,j),solve(i,j-1));
}
} int main()
{
QUICKIO
while(cin>>a>>b)
{
memset(dp,-1,sizeof(dp));
cout<<solve(a.size()-1,b.size()-1)<<endl;
}
return 0;
}

「暑期训练」「基础DP」 Common Subsequence (POJ-1458)的更多相关文章

  1. Common Subsequence POJ - 1458 最长公共子序列 线性DP

    #include <iostream> #include <algorithm> #include <string> #include <cstring> ...

  2. (线性dp,LCS) POJ 1458 Common Subsequence

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 65333   Accepted: 27 ...

  3. 「暑期训练」「基础DP」免费馅饼(HDU-1176)

    题意与分析 中文题就不讲题意了.我是真的菜,菜出声. 不妨思考一下,限制了我们决策的有哪些因素?一,所在的位置:二,所在的时间.还有吗?没有了,所以设dp[i][j]" role=" ...

  4. 「暑期训练」「基础DP」FATE(HDU-2159)

    题意与分析 学习本题的时候遇到了一定的困难.看了题解才知道这是二重背包.本题的实质是二重完全背包.二维费用的背包问题是指:对于每件物品,具有两种不同的费用,选择这件物品必须同时付出这两种代价:对于每种 ...

  5. 「暑期训练」「基础DP」 Monkey and Banana (HDU-1069)

    题意与分析 给定立方体(个数不限),求最多能堆叠(堆叠要求上方的方块严格小于下方方块)的高度. 表面上个数不限,问题是堆叠的要求决定了每个方块最多可以使用三次.然后就是对3n" role=& ...

  6. 「暑期训练」「基础DP」 Piggy-Bank (HDU-1114)

    题意与分析 完全背包问题. 算法背包九讲里面都有提到过,我自己再说下对完全背包的理解. 为什么01背包中遍历状态从VV到00?考虑一下基本方程$dp[i][j]=max(dp[i-1][j-w[i]] ...

  7. 「暑期训练」「Brute Force」 Bitonix' Patrol (CFR134D1D)

    题意 有n" role="presentation">nn个站点,排成圆形,每站间距m" role="presentation"> ...

  8. 「暑期训练」「Brute Force」 Multiplication Table (CFR256D2D)

    题意 给定一矩阵M" role="presentation">MM,Mij=ij" role="presentation">Mi ...

  9. 「暑期训练」「Brute Force」 Optimal Point on a Line (Educational Codeforces Round 16, B)

    题意 You are given n points on a line with their coordinates $x_i$. Find the point x so the sum of dis ...

随机推荐

  1. AQS2:可重入和阻塞

    本文仅基于可重入的锁(ReentrantLock类)对AQS做分析,只考虑独占锁. 共享锁与独占锁的更多信息,以后再讨论. AQS中队列的实现 节点Node AQS的节点包含了对前置节点的引用pre, ...

  2. SignalR中的依赖注入

    什么是依赖注入? 如果你已经熟悉依赖注入可以跳过此节. 依赖注入 (DI) 模式下,对象并不为自身的依赖负责. 下边的例子是一个主动 DI. 假设你有个对象需要消息日志.你可能定义了一个日志接口: C ...

  3. org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [4.0]. Default version will be used.报错

    org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [4.0]. Default versio ...

  4. 【洛谷P1073】[NOIP2009]最优贸易

    最优贸易 题目链接 看题解后感觉分层图好像非常NB巧妙 建三层n个点的图,每层图对应的边相连,权值为0 即从一个城市到另一个城市,不进行交易的收益为0 第一层的点连向第二层对应的点的边权为-w[i], ...

  5. Android学习笔记_3_四种布局

    Android布局是应用界面开发的重要一环,在Android中,共有四种布局方式, 分别是:FrameLayout( 帧布局 ).LinearLayout (线性布局).TableLayout(表格布 ...

  6. centos安装nodejs二进制包

    1.下载nodejs的二进制包 wget https://nodejs.org/dist/v6.3.1/node-v6.3.1-linux-x64.tar.xz 2.解压下载的安装包 tar xf n ...

  7. JavaScript js调用堆栈(一)

    本文主要介绍JavaScript程序内部的执行机制 首先先了解什么是执行上下文 执行上下文就是当前JavaScript代码被解析和执行是所在环境的抽象概念,JavaScript中运行任何的代码都是在执 ...

  8. 安装VMware,出现没有虚拟网络适配器的问题

    遇到错误:安装VMware Workstation Pro这个软件,网络适配器中没有虚拟网卡,导致无法上网 解决方法:遇到这个问题,我就第一时间就去网上搜索解决方法,方案有很多,但是试了很多个还是不行 ...

  9. lua浮点数取整

    向下取整 math.floor(num) 向上取整 math.ceil(num) 取整取余 math.modf(num) 测试 num = 12.4 print(math.floor(num)) 12 ...

  10. React中的全选反选问题

    全选反选问题 1.在state里维护一个数组,例如showArr:[] 2.绑定点击事件的时候将当前这个当选按钮的index加进来 <span className='arrow' onClick ...