链接:https://www.cometoj.com/contest/48/problem/B

题意:给出一串数列,要求在这个数列中找出两条“不相交”的非下降子序列使得子序列之和最大。“不相交”即不存在任意的ai同时存在于两个子序列中。

分析:笔者刷题量不多,这道题对笔者加深动态规划求子序列的理解很有帮助;题目要求非下降子序列的最大和,这里我们要求的是两条子序列。做题时的第一想法是走两遍DP,先求出一条和最大的子序列,把这条子序列中的元素给剔除,接着再重复该步骤,得到另一条和最大的子序列,最后把两条子序列的和加起来。但是,这种做法是存在后效性的,我们的目的是要求得两条子序列的和最大,如果每次只是单纯的找和最大的子序列,那么很有可能在第一次选元素时就断了使得子序列总和最大的“桥梁”。好比方说:5 4 4 5 4;通过该方案得到的两条序列会是:“4 4 5”、“5”,最终结果是18。但最优的方案其实是:“4 4 4”、“5 5”,结果为22。

  设dp[i][j]为两条子序列的末端分别为i和j时的子序列和,dp[0][0] = 0;其状态转移方程可以由单个子序列的转移方程推广得到,详见代码部分。

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 int main() {
 6     int n;
 7     scanf("%d",&n);
 8
 9     int num[n+1];
10     num[0] = 0;
11     for (int i=1;i<=n;i++) {
12         scanf("%d",&num[i]);
13     }
14
15     int dp[n+1][n+1];
16     memset(dp,0,sizeof(dp));
17     int ans = 0;
18     for (int i=1;i<=n;i++) {
19         for (int j=0;j<i;j++) {
20             if (num[i] >= num[j]) {
21                 for (int k=0;k<i;k++) {
22                     dp[i][k] = max(dp[i][k],dp[j][k] + num[i]);
23                     dp[k][i] = max(dp[k][i],dp[k][j] + num[i]);
24                     ans = max(ans,max(dp[i][k],dp[k][i]));
25                 }
26             }
27         }
28     }
29     printf("%d\n",ans);
30     return 0;
31 }

转载于:https://www.cnblogs.com/doublebit/p/11105845.html

CometOJ#6 双倍快乐(简单DP)相关推荐

  1. 2019.7.14 并查集P1197 [JSOI2008]星球大战 说能过那是假的(动态规划) cometoj #c6 双倍快乐

    星球大战 这题是使用了一个total变量持续记录连通块数目,极大减少了判断时间 一开始我直接用从0到n-1遍历找连通块,这样绝对超时 通过代码如下 #include<bits/stdc++.h& ...

  2. Comet OJ - Contest #6 B.双倍快乐(二维最大上升子序列和)

    双倍快乐 题目描述 Illyasviel:"你想要最长不下降子序列吗?" star-dust:"好啊!" Illyasviel:"老板,给我整两个最长 ...

  3. 畅享原汁+气泡的双倍快乐 摩飞气泡原汁机全面评测

    ▼前言 5月立夏以来,天气猝不及防地热了起来,东北气温也一度直高涨,直逼30度大关.在这时,能痛饮一杯"快乐水",那简直要幸福到飞起!不过,作为一个已过而立之年的大叔来说,养生早已 ...

  4. Codeforces 41D Pawn 简单dp

    题目链接:点击打开链接 给定n*m 的矩阵 常数k 以下一个n*m的矩阵,每一个位置由 0-9的一个整数表示 问: 从最后一行開始向上走到第一行使得路径上的和 % (k+1) == 0 每一个格子仅仅 ...

  5. hdu2067 简单dp或者记忆化搜索

    题意: 小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  6. POJ1088:滑雪(简单dp)

    题目链接:  http://poj.org/problem?id=1088 题目要求: 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.求可以滑落的最长长度. 题目解析: 首先要先排一 ...

  7. 第三讲 数学与简单DP【完结】

    目录 1205. 买不到的数目 [数学结论题] 1211. 蚂蚁感冒 [模拟 / 推理] 1216. 饮料换购 [简单 / 模拟] 2. 01背包问题 [板子题] 1015. 摘花生 [简单DP] 8 ...

  8. hdu 2881(简单dp)

     题意:n*n的矩阵,里面有m个格子是有任务要去完成的,t,x,y表示要在第t秒到达(x,y)的格子完成任务,问你最多可以完成多少 解题思路:简单dp,将时间排个序后就是LIS #include< ...

  9. P1005 矩阵取数游戏(__int128模板/简单dp)

    转跳P1005 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n \times mn×m 的矩阵,矩阵中的每个元素 a_{i,j}a i,j ​ 均为非负整数.游戏规则如下: 每次取数时 ...

最新文章

  1. mysql主主复制、主从复制、半同步的实现
  2. o型圈沟槽设计软件_O型圈的设计注意事项
  3. python动态语言解释_python是动态语言吗
  4. 基线系统需要受到更多关注:基于词向量的简单模型 | ACL 2018论文解读
  5. php import用法,JavaScript中import怎么使用?
  6. 配置kerberos_Step by Step 实现基于 Cloudera 5.8.2 的企业级安全大数据平台 Kerberos的整合...
  7. python程序代码大全-Python编程代码示例 - 全文
  8. 超全深度学习细粒度图像分析:项目、综述、教程一网打尽
  9. logistic映射图像加密matlab,基于Logistic映射与排序变换的图像加密算法
  10. 【开源工程】VirtualDub
  11. Python 编程之Tkinter的使用01
  12. 智源社区周刊:Gary Marcus谈大模型研究可借鉴的三个因素;OpenAI提出视频预训练模型VPT,可玩MC游戏...
  13. 处nm是什么意思_“nm”是什么意思啊?
  14. 360cdn能挡住cc攻击_人人用得起的CDN加速服务,可防御CC攻击
  15. 腾讯物联网系统TOS,内核移植起来比你想象的要简单
  16. H5分享页面背景音乐及播放视频
  17. 服务注册与发现 — 选择 CP 还是 AP?
  18. 使用Synology群晖内置web station和榴莲壳发布自己的网站(一)安装Web Station
  19. 计算机应用基础十分钟说课,计算机应用基础说课稿.ppt
  20. Termux安装数据库(手机安装数据库)...

热门文章

  1. 基于python实现将一个文件夹中的图片移动到另一个文件夹
  2. [蓝桥杯][算法提高VIP]金陵十三钗(状压dp记忆化搜索)
  3. [蓝桥杯][算法训练VIP]接水问题(思维)
  4. WSDM 2022 | 点击率模型特征交叉方向的发展及CAN模型介绍
  5. ROS2学习(十六).ROS概念 - 构建系统
  6. solr5.3.1 mysql_Solr5.3.1 dataimport 导入mysql数据
  7. oracle存储过程隐式函数,Oracle存储过程,函数。
  8. Linux Ubuntu 修改Grub,添加删除启动项,初步辨析Grub文件。
  9. AI有道干货 --- 126 篇 AI 原创文章精选(ML、DL、资源、教程)
  10. 哈希表及哈希表查找相关概念(转)