【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个什么。
这样方便优化。
转载于:https://www.cnblogs.com/hiweibolu/p/6714903.html
【JZOJ4762】【NOIP2016提高A组模拟9.7】千帆渡相关推荐
- JZOJ 100024. 【NOIP2016提高A组模拟7.6】数球
Description 小A有n个球,编号分别为1到n,小A每次都会从n个球中取出若干个球,至少取一个,至多取n个,每次取完再放回去,需要满足以下两个条件. 每次取出的球的个数两两不同. 每次取出的球 ...
- JZOJ4708. 【NOIP2016提高A组模拟8.20】奇洛金卡达 倒着做的思想+并查集维护
题目大意 给定一个长度小于等于kk的字符串和qq,表示现在有qq个操作,每个操作给定两个参数li,ril_i,r_i表示把现在的字符串第lil_i到rir_i把其中编号为奇数的按顺序写下来,再在后面把 ...
- 【NOIP2016提高A组模拟9.9】闭门造车
题目 自从htn体验了一把飙车的快感,他就下定决心要闭门造车!但是他两手空空怎么造得出车来呢?无奈的他只好来到了汽车零部件商店. 一走进商店,玲琅满目的各式零件看得htn眼花缭乱.但是他很快便反应过来 ...
- [JZOJ4788] 【NOIP2016提高A组模拟9.17】序列
题目 描述 题目大意 一个序列,每次可以使一段区间内的所有数加一(模四). 问最少的操作次数. 思考历程 一看这题目,诶,这不就是那道叫密码锁的题目吗? 然后随便打一打,样例过了,就再也没有思考这一题 ...
- JZOJ 4726. 【NOIP2016提高A组模拟8.22】种花
Description 经过三十多个小时的长途跋涉,小Z和小D终于到了NOI现场--南山南中学.一进校园,小D就被花所吸引了(不要问我为什么),遍和一旁的种花园丁交(J)流(L)了起来. 他发现花的摆 ...
- JZOJ 4676. 【NOIP2016提高A组模拟7.21】模板串
Description 科学家温斯顿从数据库中找到了一串相当长的字符串. 他正试图用一个模板串来重构这个字符串. 他可以将模板串复制多份,通过合适的方式拼接起来,使得最终的串与原串一致. 如果两个模板 ...
- JZOJ 4675. 【NOIP2016提高A组模拟7.21】Double-row
Description 科学家温斯顿在一张超长的白纸上写下了两行数,每一行数有N个. 但他写完后觉得看起来有点不和谐.他希望重新编排,使得每一行数中没有相同的数. 他每次可以调换同一列的两个数. 请帮 ...
- JZOJ 4786. 【NOIP2016提高A组模拟9.17】小a的强迫症
Description Input Sample Input 3 2 2 1 Output Sample Output 3 样例解释: Data Constraint Solution 首先,我们设之 ...
- 【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( ...
- 【NOIP2016提高A组模拟10.15】打膈膜
题目 分析 贪心, 先将怪物按生命值从小到大排序(显然按这个顺序打是最优的) 枚举可以发对少次群体攻击, 首先将所有的群体攻击发出去, 然后一个一个怪物打,当当前怪物生命值大于2,如果还有魔法值就放重 ...
最新文章
- ListView的使用和数据绑定
- tcga数据下载_TCGA数据下载(mRNA)
- 优酷复制的html代码怎么用,关于网页上增加视频功能的代码
- [html] 说说你对HTML元素的显示优先级的理解
- 量化感知训练_如何评估训练质量?常被训练者忽视的内部负荷
- java根据系统时间拼凑文件名字
- Python IO模型
- Luogu5629 【AFOI-19】区间与除法
- 关于arcview 3.2 中输出图形添加坐标网格(Graticules and Measured Grids)时直接退出的问题...
- gulp压缩图片插件大比拼
- 密码学--CTF Crypto
- 观音菩萨是企业家和领导者的好榜样
- bugku 抄错的字符
- php cpu主频,处理器主频概念及 xxxGHz 的运算速度
- IDEA中出现java file outside of source root
- 电脑开机启动选择系统
- Eclipse_Java文件注解乱码
- Java线程状态中BLOCKED和WAITING有什么区别?
- 孕妇能吃哪些水果?三种水果帮你补充高营养
- 微信小程序页面竖向滚动逻辑