「题解」蝙蝠侠的麻烦
没 事 找 事
「我的做题历程」:
step1:观察题面。
「蝙蝠侠需要找到一个最长的字符串,使得这个字符串作为一个子序列被包含在所有的三个字符串中」,可以得出这是一道最长公共子序列,而且有三个字符串。(题型:线性 dp —— 最长公共子序列)
「蝙蝠侠现在需要找到的是最大的长度,而不是序列」,说明只是一道普通的 LCS。
step2:思考解法。
第一步思考 dp 状态:
d p i , j , k dp_{i,j,k} dpi,j,k:第一串前 i i i 项,第二串前 j j j 项,第三串前 k k k 项中的最长公共子序列长度。
对于当前的 a i , b j , c k a_{i}, b_{j}, c_{k} ai,bj,ck 而言,只有能做贡献或无法做贡献两种状态。
若 a i = b j = c k a_{i}= b_{j}= c_{k} ai=bj=ck,则它们能做贡献,此时的最长公共子序列的长度为第一串前 i − 1 i - 1 i−1 项,第二串前 j − 1 j - 1 j−1 项,第三串前 k − 1 k - 1 k−1 项中的最长公共子序列的长度加 1 1 1。
否则它们无法做贡献,此时放弃做贡献最小的那一项。
第二步思考状态转移方程:
本题比常规的 LCS 要多一个字符串,因此只需要再多一维就好。
d p i , j , k = d p i − 1 , j − 1 , k − 1 + 1 ( a i = b j = c k ) dp_{i, j, k} = dp_{i - 1, j - 1 ,k - 1} + 1\ (a_{i} = b_{j} = c_{k}) dpi,j,k=dpi−1,j−1,k−1+1 (ai=bj=ck)
d p i , j , k = max { d p i − 1 , j , k , d p i , j − 1 , k , d p i , j , k − 1 } ( a i ≠ b j or b j ≠ c k or a i ≠ c k ) dp_{i, j, k} = \max\{dp_{i - 1, j ,k},dp_{i, j - 1 ,k},dp_{i, j ,k - 1}\} \ (a_{i} \ne b_{j} \text{ or } b_{j} \ne c_{k} \text{ or }a_{i} \ne c_{k}) dpi,j,k=max{dpi−1,j,k,dpi,j−1,k,dpi,j,k−1} (ai=bj or bj=ck or ai=ck)
step3:完成代码:
因为有三个字符串,所以需要比平常的 LCS 多一层循环。
代码(抵制学术不端行为,拒绝 Ctrl + C):
#include <bits/stdc++.h>
using namespace std;
const int N = 5e1 + 5;
char a[N], b[N], c[N];
int la, lb, lc, dp[N][N][N];
/*
dp(i, j, k): 前 i, j, k 项中的最长公共子序列
if a(i) = b(j) = c(k)dp(i, j, k) = dp(i - 1, j - 1, k - 1) + 1;
else dp(i, j, k) = max{dp(i - 1, j, k), dp(i, j - 1, k), dp(i, j, k - 1)};
*/
int main() {freopen("trouble.in", "r", stdin);freopen("trouble.out", "w", stdout);scanf("%s\n%s\n%s", a + 1, b + 1, c + 1);la = strlen(a + 1), lb = strlen(b + 1), lc = strlen(c + 1);for (int i = 1; i <= la; i++) {for (int j = 1; j <= lb; j++) {for (int k = 1; k <= lc; k++) {if (a[i] == b[j] && b[j] == c[k]) {dp[i][j][k] = dp[i - 1][j - 1][k - 1] + 1;} else {dp[i][j][k] = max(dp[i - 1][j][k], max(dp[i][j - 1][k], dp[i][j][k - 1]));}}}}printf("%d", dp[la][lb][lc]);return 0;
}
Trouble is a friend, but Accepted is better than it!
让我们来解决 『蝙蝠侠的麻烦』 叭~
Bye bye!!1
「题解」蝙蝠侠的麻烦相关推荐
- 「题解」:[组合数学]:Perm 排列计数
题干: Description称一个1,2,-,N的排列P1,P2-,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,-N的排列中有多少是Magic的,答 ...
- 「题解」:[BZOJ4558]方
问题: 方 时间限制: 2 Sec 内存限制: 256 MB 题面 题目描述 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一 ...
- 「题解」300iq Contest 2 B Bitwise Xor
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:gym102331B. 题意概述 给你一个长度为 nnn 的序列 aia_iai,求一个最长的子序列满足所有子序列中的元 ...
- 「题解」:[线段树]:永无乡
题面 题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 ...
- 「题解」USACO15FEB Fencing the Herd G
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书: 题目 题目链接:洛谷 P3122.USACO 官网. 题意概述 给你平面上的一些点和直线,有两种操作: 新加入一个点 (x,y)(x,y) ...
- 「题解」300iq Contest 2 H. Honorable Mention
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:gym102331H. 题意概述 给定一个长度为 n n n 的序列 a a a,有 q q q 次询问,每次询问给定三个 ...
- 「题解」老鼠与猫的交易
题目描述 有一只老鼠很喜欢奶酪,但是奶酪被分别放在N个房间里,而且这些房间都有一只猫咪看守,现在它准和猫咪们 做个交易.它有M磅的猫食,想用这M磅猫食换取奶酪.在猫咪看守的每一个房间里有奶酪J[i]磅 ...
- 「题解」清华集训 2016 你的生命已如风中残烛
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书: 题目 题目链接:洛谷 P6672.UOJ 273. 题意简述 给你牌数为 m + 1 m+1 m+1 的牌堆,其中第 m + 1 m+1 ...
- 「题解」CF1468M Similar Sets
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:洛谷.CF1468M. 题意简述 给定 n n n 个集合 S 1 ∼ n S_{1\sim n} S1∼n,问是否存在 ...
最新文章
- Const 重载解析
- android studio 怎么做屏幕适配?
- Android媒体播放框架MediaSessionCompat介绍实践
- Nature认定:中国高校论学术,中科大无悬念第一
- SecutrCRTt 连接VirtualBox 中的Ubuntu -端口转发
- 深度学习(神经网络) —— BP神经网络原理推导及python实现
- 数博会重磅活动:第二届大数据科学与工程国际会议议程
- 全国计算机等级英语一级考试,全国计算机等级考试职业英语一级考试大纲
- 神经网络之感知器算法简单介绍和MATLAB简单实现
- [转]Groovy和Grails简介
- Sql Server 的sa用户被禁用
- 自定义控件之圆形的image
- cadence ic5141安装包_linux下安装cadence ic5141
- 算法:线性时间选择(C/C++)
- pr 无法启动因为计算机丢失,pramtlib.dll_“PR打不开,因为计算机丢失TimeWarpFilter.dll”是怎么回事?怎么办啊?_prccamtlib.dll...
- 【柒穆雨】平面设计好不好学?设计小白该如何学习平面设计
- 阿里云服务器的登录方法
- Ubuntu 20安装微信3.0版本的方法 v2022
- 打印机服务器文件,打印机服务器ftp配置文件
- 2022年化工自动化控制仪表考试试题模拟考试平台操作