题目描述

输入

输出

样例输入

5
1 4 2 5 1
4
1 1 2 4

样例输出

2
1 4

数据范围

解法

设f[i][j]表示 i个蓝色帆船中,选择了 j个红色帆船作为结尾的最大答案。
那么:
f[i][j]=max(f[i−1][k]+1)(k<j,a[k]<b[j],a[i]=b[j])
f[i][j]=f[i−1][j](a[i]!=b[j])
考虑优化,从k入手:
维护h[i][j]表示在f[i][j] (a[i]=b[j])时最大的k使得满足转移条件。
h[i][j]可以从h[i-1][k]中转移过来。

代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
const char* fin="aP2.in";
const char* fout="aP2beta.out";
const int inf=0x7fffffff;
const int maxn=5007;
int read(){char ch=getchar();int x=0;while (ch<'0' || ch>'9') ch=getchar();while (ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x;
}
int n,m,i,j,k,l,o,ans=0,ans1,ans2;
int cans[maxn];
int a[maxn],b[maxn];
int f[maxn][maxn],g[maxn][maxn],h[maxn][maxn];
int main(){scanf("%d",&n);for (i=1;i<=n;i++) scanf("%d",&a[i]);scanf("%d",&m);for (i=1;i<=m;i++) scanf("%d",&b[i]);for (i=1;i<=n;i++)for (j=1;j<=n;j++){if (a[i]==b[j]){k=h[i][j];if (k<j && b[k]<b[j] && f[i][j]<f[i-1][k]+1){f[i][j]=f[i-1][k]+1;g[i][j]=k;if (ans<f[i][j]){ans1=i;ans2=j;ans=f[i][j];}}}else f[i][j]=f[i-1][j],g[i][j]=j;if (b[j]<a[i+1]) {if (f[i][h[i+1][j-1]]<f[i][j]) h[i+1][j]=j;else h[i+1][j]=h[i+1][j-1];}else h[i+1][j]=h[i+1][j-1];}printf("%d\n",ans);while (ans1){if (a[ans1]==b[ans2]){cans[++cans[0]]=a[ans1];}j=ans1;k=ans2;ans1=j-1;ans2=g[j][k];}for (i=ans;i;i--) printf("%d ",cans[i]);return 0;
}

启发

当初把f[i][j]设成了选了第i个蓝色帆船和第j个红色帆船的最大答案。
然后使得动态规划优化困难。
不过也运用了去除冗余状态的方法,把这个O(n^3)的动态规划优化到了80分。
联系以前的启发;


事实上动态规划的第一维都可以设成前i个什么。
这样方便优化。

转载于:https://www.cnblogs.com/hiweibolu/p/6714903.html

【JZOJ4762】【NOIP2016提高A组模拟9.7】千帆渡相关推荐

  1. JZOJ 100024. 【NOIP2016提高A组模拟7.6】数球

    Description 小A有n个球,编号分别为1到n,小A每次都会从n个球中取出若干个球,至少取一个,至多取n个,每次取完再放回去,需要满足以下两个条件. 每次取出的球的个数两两不同. 每次取出的球 ...

  2. JZOJ4708. 【NOIP2016提高A组模拟8.20】奇洛金卡达 倒着做的思想+并查集维护

    题目大意 给定一个长度小于等于kk的字符串和qq,表示现在有qq个操作,每个操作给定两个参数li,ril_i,r_i表示把现在的字符串第lil_i到rir_i把其中编号为奇数的按顺序写下来,再在后面把 ...

  3. 【NOIP2016提高A组模拟9.9】闭门造车

    题目 自从htn体验了一把飙车的快感,他就下定决心要闭门造车!但是他两手空空怎么造得出车来呢?无奈的他只好来到了汽车零部件商店. 一走进商店,玲琅满目的各式零件看得htn眼花缭乱.但是他很快便反应过来 ...

  4. [JZOJ4788] 【NOIP2016提高A组模拟9.17】序列

    题目 描述 题目大意 一个序列,每次可以使一段区间内的所有数加一(模四). 问最少的操作次数. 思考历程 一看这题目,诶,这不就是那道叫密码锁的题目吗? 然后随便打一打,样例过了,就再也没有思考这一题 ...

  5. JZOJ 4726. 【NOIP2016提高A组模拟8.22】种花

    Description 经过三十多个小时的长途跋涉,小Z和小D终于到了NOI现场--南山南中学.一进校园,小D就被花所吸引了(不要问我为什么),遍和一旁的种花园丁交(J)流(L)了起来. 他发现花的摆 ...

  6. JZOJ 4676. 【NOIP2016提高A组模拟7.21】模板串

    Description 科学家温斯顿从数据库中找到了一串相当长的字符串. 他正试图用一个模板串来重构这个字符串. 他可以将模板串复制多份,通过合适的方式拼接起来,使得最终的串与原串一致. 如果两个模板 ...

  7. JZOJ 4675. 【NOIP2016提高A组模拟7.21】Double-row

    Description 科学家温斯顿在一张超长的白纸上写下了两行数,每一行数有N个. 但他写完后觉得看起来有点不和谐.他希望重新编排,使得每一行数中没有相同的数. 他每次可以调换同一列的两个数. 请帮 ...

  8. JZOJ 4786. 【NOIP2016提高A组模拟9.17】小a的强迫症

    Description Input Sample Input 3 2 2 1 Output Sample Output 3 样例解释: Data Constraint Solution 首先,我们设之 ...

  9. 【JZOJ4819】【NOIP2016提高A组模拟10.15】算循环

    题目描述 输入 输出 样例输入 167 198 样例输出 906462341 数据范围 解法 令f(n)=∑ni=1i,g(n)=∑ni=1i2 易得ans=∑ni=1∑mj=1f(n−i+1)∗f( ...

  10. 【NOIP2016提高A组模拟10.15】打膈膜

    题目 分析 贪心, 先将怪物按生命值从小到大排序(显然按这个顺序打是最优的) 枚举可以发对少次群体攻击, 首先将所有的群体攻击发出去, 然后一个一个怪物打,当当前怪物生命值大于2,如果还有魔法值就放重 ...

最新文章

  1. ListView的使用和数据绑定
  2. tcga数据下载_TCGA数据下载(mRNA)
  3. 优酷复制的html代码怎么用,关于网页上增加视频功能的代码
  4. [html] 说说你对HTML元素的显示优先级的理解
  5. 量化感知训练_如何评估训练质量?常被训练者忽视的内部负荷
  6. java根据系统时间拼凑文件名字
  7. Python IO模型
  8. Luogu5629 【AFOI-19】区间与除法
  9. 关于arcview 3.2 中输出图形添加坐标网格(Graticules and Measured Grids)时直接退出的问题...
  10. gulp压缩图片插件大比拼
  11. 密码学--CTF Crypto
  12. 观音菩萨是企业家和领导者的好榜样
  13. bugku 抄错的字符
  14. php cpu主频,处理器主频概念及 xxxGHz 的运算速度
  15. IDEA中出现java file outside of source root
  16. 电脑开机启动选择系统
  17. Eclipse_Java文件注解乱码
  18. Java线程状态中BLOCKED和WAITING有什么区别?
  19. 孕妇能吃哪些水果?三种水果帮你补充高营养
  20. 微信小程序页面竖向滚动逻辑

热门文章

  1. HDU 1203 I need a offer! (01背包)
  2. Power BI for Office 365 概览
  3. [转] 谈谈MIXI的开源SNS架构
  4. [PHP]图片上传代码【原创】
  5. EF BB BF的问题
  6. 这款IDEA插件刷爆了技术群,群友:这用起来真酸爽~
  7. Spring Cloud 2020 版本最佳实践,你落伍了!
  8. 互联网架构师祝大家中秋节快乐!快领红包了!
  9. 运维必看:2017 年 Python 大事件年度盘点!
  10. 【算法】经典的ML算法(后续结合工作实践完善心得)