博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Comet OJ - Contest #6 B.双倍快乐(二维最大上升子序列和)
阅读量:5083 次
发布时间:2019-06-13

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

双倍快乐

题目描述

 

Illyasviel:"你想要最长不下降子序列吗?"

star-dust:"好啊!"

Illyasviel:"老板,给我整两个最长不下降子序列,要最大的。"

求序列 a 中的两个不相交的不下降子序列使得他们的元素和的和最大,子序列可以为空。

注 1:序列 a 不下降的定义是不存在 l<r 且 al>ar

注 2:两个子序列不相交的定义是:不存在 ai 即在第一个子序列中也在第二个子序列中。

 

输入描述

 

第一行一个数字 n 代表序列 a 的长度。

接下来一行 n 个数,第 i 个数代表 ai

数据范围:

  • 2n500
  • 1ai105

 

输出描述

 

一行一个整数代表两个不相交的不下降子序列的元素和的最大值。

 

样例输入 1 

95 3 2 1 4 2 1 4 6

样例输出 1

22

提示

样例解释:

第一个序列选了 "5"

第二个序列选了 "3 4 4 6"

总和为 22。

 

二维LIS变式求两不相交上升子序列最大和。

非常好的一道题。其中思想与一维LIS相似只不过拓展到二维,dp[i][j]表示两序列分别以i,j为结尾的最大和,通过两重for来枚举i,j的情况。

这里有一个巧妙的性质:虽然i,j在枚举时会有相同的情况,但是dp只对含k的情况更新,而k!=i与j即两下标不会相等,所以这里保证了两序列不会有相交的元素。

 

#include
using namespace std;typedef long long ll;int a[505];int dp[505][505];int main(){ int n,m,i,j,k; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&a[i]); } for(k=1;k<=n;k++){ for(i=0;i

 

转载于:https://www.cnblogs.com/yzm10/p/11105443.html

你可能感兴趣的文章
不知道做什么时
查看>>
matlab 给某一列乘上一个系数
查看>>
密码学笔记——培根密码
查看>>
Screening technology proved cost effective deal
查看>>
MAC 上升级python为最新版本
查看>>
创业老板不能犯的十种错误
查看>>
Animations介绍及实例
查看>>
判断请求是否为ajax请求
查看>>
【POJ2699】The Maximum Number of Strong Kings(网络流)
查看>>
spring boot配置跨域
查看>>
BZOJ 1996 合唱队(DP)
查看>>
进击吧!阶乘——大数乘法
查看>>
安卓学习资料推荐-25
查看>>
Mysql数据库备份和还原常用的命令
查看>>
关于退出当前页面在火狐的一些问题
查看>>
【项目实施】项目考核标准
查看>>
spring-aop AnnotationAwareAspectJAutoProxyCreator类
查看>>
经典入门_排序
查看>>
Redis Cluster高可用集群在线迁移操作记录【转】
查看>>
二、spring中装配bean
查看>>