博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1423 LICS 模板
阅读量:4623 次
发布时间:2019-06-09

本文共 1548 字,大约阅读时间需要 5 分钟。

 

 

4、LICS、O(lena * lenb)

设dp[i][j]表示a[]的前i项,以b[]的第j项结尾时,能匹配的最大值。

①、不匹配a[i]这个数,则是dp[i][j] = dp[i – 1][j];

②、匹配a[i]这个数,则需要a[i] == b[j] && b[j] > b[k]   推出   dp[i][j] = max(dp[i – 1][k]) + 1,

 

这样复杂度需要O(n3),注意到,求解dp的时候,是从dp[i][1….lenb]这样的顺序求解,而且,需要a[i] == b[j]才能算做贡献,因为要LCS嘛!那么可以记录dp[i][1…j – 1]的信息,以a[i]作为基准(因为a[i] == b[j]才能算出贡献,以那个作为基准没所谓),找出前j - 1个数中,满足LIS并且最大的那个,O(1)更新即可。

#include 
#include
#include
#include
#include
#include
#define IOS ios::sync_with_stdio(false)using namespace std;#define inf (0x3f3f3f3f)typedef long long int LL;#include
#include
#include
#include
#include
#include
#include
#include
const int maxn = 500 + 20;int dp[maxn][maxn];int a[maxn], b[maxn];void work() { int lena, lenb; cin >> lena; for (int i = 1; i <= lena; ++i) { cin >> a[i]; } cin >> lenb; for (int i = 1; i <= lenb; ++i) { cin >> b[i]; } memset(dp, 0, sizeof dp); for (int i = 1; i <= lena; ++i) { for (int j = 1, cnt = 0; j <= lenb; ++j) { dp[i][j] = dp[i - 1][j]; //不要当前这个a[i] if (a[i] > b[j]) { //形成LIS cnt = max(cnt, dp[i - 1][j]); } if (a[i] == b[j]) { //形成LCS dp[i][j] = cnt + 1; } } } int ans = 0; for (int i = 1; i <= lenb; ++i) ans = max(ans, dp[lena][i]); cout << ans << endl;}int main() {#ifdef local freopen("data.txt", "r", stdin);// freopen("data.txt", "w", stdout);#endif int t; cin >> t; while (t--) { work(); if (t) printf("\n"); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/liuweimingcprogram/p/6523607.html

你可能感兴趣的文章
java实现读取文件大全
查看>>
[Cordova] 无法显示Alert视窗
查看>>
借助过度区选择阈值
查看>>
评论列表显示及排序,个人中心显示
查看>>
JavaWeb学习笔记总结 目录篇
查看>>
C#根据html生成PDF
查看>>
Neutron SDN 手动实现手册
查看>>
linux下core文件调试方法
查看>>
20个创意404错误页面设计的启示
查看>>
基础训练 芯片测试
查看>>
如何用命令将本地项目上传到git
查看>>
JavaScript 实现鼠标拖动元素
查看>>
js 模糊查询 (360接口)
查看>>
python+rabbitMQ实现生产者和消费者模式
查看>>
“模态”对话框和“后退”按钮
查看>>
关于javascript实现的网站页面侧边悬浮框"抖动"问题
查看>>
linux_命令格式和命令提示符
查看>>
Cocos2d-X-3.0之后的版本的环境搭建
查看>>
when case group by 的用法集合
查看>>
洛谷P1908 逆序对
查看>>