【SJTUOJ笔记】P1072 小X的生物实验
2018-02-14 11:29
204 查看
https://acm.sjtu.edu.cn/OnlineJudge/problem/1072
看完题目,第一感觉是:这不裸LCS吗,前面那些条件有什么用?再看数据范围,发现如果还用一般LCS的O(n2)O(n2)做法,肯定会超时。那么必须用到所给的条件:每个序列中,1..N1..N之间的每个数恰好出现5次。
回想一般LCS的转移方程。用f[i, j]f[i, j]表示两个串分别到位置ii和位置jj的LCS长度,那么有
f[i, j]={f[i−1, j−1]+1max{f[i−1, j],f[i, j−1]}(a[i]=b[j])(a[i]≠b[j])f[i, j]={f[i−1, j−1]+1(a[i]=b[j])max{f[i−1, j],f[i, j−1]}(a[i]≠b[j])
我们可以把1..N1..N每次出现的位置提前存储起来,这样,利用树状数组,就可以实现log(n)log(n)级别的修改和求maxmax。
核心部分如下:
看完题目,第一感觉是:这不裸LCS吗,前面那些条件有什么用?再看数据范围,发现如果还用一般LCS的O(n2)O(n2)做法,肯定会超时。那么必须用到所给的条件:每个序列中,1..N1..N之间的每个数恰好出现5次。
回想一般LCS的转移方程。用f[i, j]f[i, j]表示两个串分别到位置ii和位置jj的LCS长度,那么有
f[i, j]={f[i−1, j−1]+1max{f[i−1, j],f[i, j−1]}(a[i]=b[j])(a[i]≠b[j])f[i, j]={f[i−1, j−1]+1(a[i]=b[j])max{f[i−1, j],f[i, j−1]}(a[i]≠b[j])
我们可以把1..N1..N每次出现的位置提前存储起来,这样,利用树状数组,就可以实现log(n)log(n)级别的修改和求maxmax。
核心部分如下:
//已经用pos[i][j]存储了数字i第j次出现的位置 //find和change函数是正常的树状数组查找、修改函数 int ans = 0; for (int i = 1; i <= n; ++i){ int x; cin >> x; // 读入第二个字串 for (int j = 4; ~j; –j){ int t = find(pos[x][j] - 1) + 1; ans = max(t, ans); change(pos[x][j], t); } }
相关文章推荐
- 【算法学习笔记】72.LCS 最大公公子序列 动态规划 SJTU OJ 1065 小M的生物实验1
- 所有SQL*Loader实验笔记
- vsftpd笔记后的实验
- TCP与UDP模拟实验学习笔记
- arm笔记2-arm嵌入式系统实验教程(3)实验2.24
- RIP实验笔记
- NS 2.35 柯志亨书-实验3笔记-TCP UDP模拟 ——计算FTP不同参数:时延、抖动、吞吐率、丢包率awk代码
- CCIE实验笔记之-第3章 WAN协议(帧中继)之六
- 51单片机学习笔记【九】——红外通信实验
- 软件测试实验学习笔记系列1
- C#学习笔记--关于银行存取款的小实验
- [机器学习] 实验笔记 - 表情识别(emotion recognition)
- go语言方法Value Receiver, Pointer Receiver各种不同情况的实验笔记
- 20135316王剑桥 linux第三周课实验笔记
- 域和域控制器以及组策略【笔记|实验】
- 学习笔记----linux smb 小实验
- STM8学习笔记三----按键实验
- 【stm32学习笔记之一】跑马灯实验(基于库函数)
- cortex_m3_stm32嵌入式学习笔记(六):窗口看门狗实验(WWDG)
- 花生壳域名实验【个人笔记,仅供参考】