博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CSU 1120 病毒
阅读量:4696 次
发布时间:2019-06-09

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

最长公共上升子序列(LCIS)

裸的算法题。

动态规划:

  两组数组a[n]、b[m]。

  f[i][i]表示以a[i]、b[j]结尾的两个数组的LCIS。

  转移方程:

    a[i]!=b[j] : f[i][j]=f[i-1][j];

    a[i]==b[j] : f[i][j]=max (f[i-1][k]) + 1;(1<=k<j&&b[j]>b[k] )

  max (f[i-1][k])可以在访问f[i][k]的时候维护更新一个max变量来得到,这样就是O(n*m)的时间复杂度。

 

ps:找这个算法的时候看到某队省赛的时候不会,同病相怜哈,还好我们只是训练赛不会。灭哈哈哈~

 

1 #include 
2 #include
3 #include
4 using namespace std; 5 6 int f[1005][1005]; 7 int main (){
//cout<<"error"<
>t;13 while (t--){14 cin>>n1;15 for (int i=1;i<=n1;i++)16 cin>>a[i];17 cin>>n2;18 for (int i=1;i<=n2;i++)19 cin>>b[i];20 memset (f,0,sizeof f);21 for (int i=1;i<=n1;i++){22 max=0;23 for (int j=1;j<=n2;j++){24 f[i][j]=f[i-1][j];25 if (a[i]>b[j]&&f[i-1][j]>max)26 max=f[i-1][j];27 if (a[i]==b[j])28 f[i][j]=max+1;29 }30 }31 int ans=0;32 for (int i=1;i<=n2;i++)33 if (f[n1][i]>ans)34 ans=f[n1][i];//cout<
<<" ";35 cout<
<

 

转载于:https://www.cnblogs.com/gfc-g/p/3951903.html

你可能感兴趣的文章
c++友元
查看>>
c++运算符重载
查看>>
一元运算符重载
查看>>
Windows 远程栈溢出挖掘
查看>>
(网页)the server responded with a status of 403 (Forbidden)
查看>>
葡萄城报表介绍:Java 报表
查看>>
android 通知消息一
查看>>
UNET学习笔记2 - 高级API(HLAPI)
查看>>
腾讯编程马拉松2012第一题
查看>>
Day18
查看>>
Web Service数据源
查看>>
php.ini详解(转)
查看>>
[转]基于Python的接口测试框架
查看>>
"ORA-00942: 表或视图不存在 "的原因和解决方法[转]
查看>>
PeekMessage、GetMessage的区别
查看>>
磁盘使用率达到100%
查看>>
linux跳过root密码登陆
查看>>
201571030130/201571030124《小学四则运算练习软件需求说明》结对项目报告
查看>>
mini2440 U-boot 编译
查看>>
在UTF-8中,一个汉字为什么需要三个字节?
查看>>