【JZOJ4762】【NOIP2016提高A组模拟9.7】千帆渡
题目描述
输入
输出
样例输入
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个什么。
这样方便优化。
【JZOJ4762】【NOIP2016提高A组模拟9.7】千帆渡的更多相关文章
- JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数
4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms Memory Limits: 262144 KB Detailed ...
- 【NOIP2016提高A组模拟9.14】数列编辑器
题目 分析 比赛上,没有注意到询问只询问光标前面,于是只打了个暴力. 因为询问只询问光标前面,首先,当光标向后每移动到一个位置,顺便将这个位置的前缀和,和最大前缀和求出来. 总之,模拟 #includ ...
- 【NOIP2016提高A组模拟9.24】总结
第一题纯模拟,结果那个出题人脑子似乎进水了,空间限制开了1G!!! 导致我捉摸了半天为什么空间要开那么大,最后只能得出上面的结论. 第二题是个矩阵快速幂,比赛上我没把递推式求出来,但是根据各种乱搞,得 ...
- 【JZOJ4746】【NOIP2016提高A组模拟9.3】树塔狂想曲
题目描述 相信大家都在长训班学过树塔问题,题目很简单求最大化一个三角形数塔从上往下走的路径和.走的规则是:(i,j)号点只能走向(i+1,j)或者(i+1,j+1).如下图是一个数塔,映射到该数塔上行 ...
- 【JZOJ4745】【NOIP2016提高A组模拟9.3】看电影
题目描述 听说NOIP2016大家都考得不错,于是CCF奖励省常中了 K 张变形金刚5的电影票奖励OI队的同学去看电影.可是省常中OI队的同学们共有 N(N >= K)人.于是机智的你想到了一个 ...
- 【JZOJ4803】【NOIP2016提高A组模拟9.28】求导
题目描述 输入 输出 样例输入 2x^2+3x+1 样例输出 4x+3 数据范围 样例解释 求导的意思: 多项式是由若干个单项式构成的 单项式的一般形式是ax^b,其中ab都是常数,x是自变量 对于单 ...
- 【JZOJ4787】【NOIP2016提高A组模拟9.17】数格子
题目描述 输入 输出 样例输入 1 10000 3 10000 5 10000 0 0 样例输出 1 11 95 数据范围 每个测试点数据组数不超过10组 解法 状态压缩动态规划. 设f[i][j]表 ...
- [jzoj 4668] [NOIP2016提高A组模拟7.19] 腐败 解题报告(质数分类+慢速乘)
题目链接: http://172.16.0.132/senior/#main/show/4668 题目: 题解: 考虑把A数组里的每个元素分解质因数,对于每个质因数开一个vector存一下包含这个质因 ...
- [jzoj 4722] [NOIP2016提高A组模拟8.21] 跳楼机 解题报告 (spfa+同余)
题目链接: http://172.16.0.132/senior/#main/show/4722 题目: DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天 ...
随机推荐
- 20191004-gugugu公告
作者洗手不干了,所以以后可能会不写考试反思而是要写题解了…… ××这是$Day7$,于是我跪了 (不会,于是准备自己$YY$) 加油啊$LNC$你一定能$AK$的(雾 但是他因为太愧疚而没有打症结而是 ...
- Interface Builder: What are the UIView's Layout iOS 6/7 Deltas for?
up vote57down votefavorite 19 I just noticed the iOS 6/7 Delta property found under the UIView's str ...
- 原 jeecms9自定义标签以及使用新创建的数据库表
转载地址:https://blog.csdn.net/nice_meng/article/details/89179089 本系统使用的是jeecmsv9版本,收集网上知识后,进行个人汇总 首先,自己 ...
- 洛谷p1605--迷宫 经典dfs
https://www.luogu.org/problemnew/show/P1605 用这种题来复习一下dfs 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问 ...
- Ajax和json一道基本的练习题
关于ajax是javaEE中最基本的操作: 下面是这道题: 基本功能: jsp+servlet+ajax实现用户信息查询,实现无刷新删除 用户信息包括 学号 姓名 出生日期 性别 操作 2017010 ...
- SELinux安全方式
一.SElinux配置文件 在CentOS 7系统中部署SELinux非常简单,由于SELinux已经作为模块集成到内核中,默认SELinux已经处于激活状态.对管理员来说,更多的是需要配置与管理SE ...
- Puppet master-agent模型搭建
Puppet master-agent模型工作过程: 基于ssl xmlrpc进行通信,端口8140/tcp agent:默认每隔30分钟向master发送node name和facts,并请求cat ...
- 【html、CSS、javascript-2】CSS基础
CSS CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 一 css的四种引入方式 1.行内式 ...
- Thinkphp [美味]常用代码
//调试开关 function _initialize () { // 调试开关 C ( 'SHOW_PAGE_TRACE', TRUE ); } //判断 IS_AJAX && $t ...
- random模块&hashlib模块
random模块1.random.randrange(1, 10):返回1-10之间的一个随机数,不包括102.random.randint(1,10):返回1-10之间的一个随机数,包括103.ra ...