凤凰院凶真 解题报告

凤凰院凶真

Description

\(α\) 世界线.

凤凰院凶真创立了反抗 \(SERN\) 统治的组织 “瓦尔基里”. 为了脱离 \(α\) 线, 他需要制作一个世界线

变动率测量仪.

测量一个世界线相对于另一个世界线的变动率, 实质上就是要求出这两个世界线的最长公共合

法事件序列.

一个世界线的事件逻辑序列是一个正整数序列, 第 \(k\) 个数表示第 \(k\) 个事件发生的时间.

对于一个世界线, 一个合法的事件序列是事件逻辑序列的一个子序列, 满足时间严格递增.

现在, 对于两个不同的世间线 \(α\) ,\(β\), 求出最长的一个事件序列, 满足这个序列在 \(α,β\) 世界线中

均是合法的.

这个序列也就是之前提到过的最长公共合法事件序列

Input Format

第一行一个整数 \(n\), 表示 \(α\) 世界线的事件个数.

第二行 \(n\) 个整数 \(a_1,a2,\dots,a_n\), 表示 \(α\) 世界线的事件逻辑序列.

第三行一个整数 \(m\), 表示 \(β\) 世界线的事件个数.

第四行 \(m\) 个整数 \(b_1,b_2,\dots,b_m\), 表示 \(β\) 世界线的事件逻辑序列.

Output Format

第一行一个整数 \(k\), 表示最长公共合法事件序列的长度.

第二行 \(k\) 个整数, 表示最长公共合法事件序列. 如果有多解, 输出任意一个.

Constraints

无论执迷过去

还是叹息未来

皆是不准有丝毫误算的必然

子任务编号 分数 \(n,m\) \(a_i,b_i\)
1 10 \(\le 10\) \(\le 2^{30}\)
2 10 \(\le 20\) \(\le 2^{30}\)
3 10 \(\le 100\) \(\le 2^{30}\)
4 15 \(\le 400\) \(\le 2^{30}\)
5 15 \(\le 1000\) \(\le 200\)
6 15 \(\le 1000\) \(\le 2^{30}\)
7 25 \(\le 5000\) \(\le 2^{30}\)

对于\(100\%\)的数据,\(1 \le n,m \le 5000,1 \le a_i,b_i \le 2^{30}\)

Solution

就是\(LCIS\)问题啦,其实还是比较巧妙的感觉

令\(dp_{i,j}\)代表\(a\)串前\(i\)个位置与\(b\)串前\(j\)个位置匹配并且\(j\)为匹配的末尾的最长长度。

朴素的,有

若\(a_i=b_j\),则\(dp_{i,j}=\max\limits_{b_k<a_i} dp_{i-1,k}+1\)

否则,\(dp_{i,j}=dp_{i-1,j}\)

发现\(k\)那一维是不需要枚举的,直接用前缀最大值优化一下就可以了,因为在\(i\)一定时,决策集合是递增的。



Code:

#include <cstdio>
const int N=510;
int dp[N][N],pre[N][N],ans[N],tot,n,m,a[N],b[N];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",a+i);
    scanf("%d",&m);
    for(int i=1;i<=m;i++) scanf("%d",b+i);
    for(int i=1;i<=n;i++)
    {
        int mx=0,id=0;
        for(int j=1;j<=m;j++)
        {
            if(a[i]==b[j])
                dp[i][j]=mx+1,pre[i][j]=id;
            else
                dp[i][j]=dp[i-1][j];
            if(dp[i-1][j]>mx&&a[i]>b[j]) mx=dp[i-1][j],id=j;
        }
    }
    int mx=0,r1=n,r2;
    for(int i=1;i<=m;i++)
        if(mx<dp[n][i])
            mx=dp[n][i],r2=i;
    ans[++tot]=r2;
    printf("%d\n",mx);
    if(mx==0) return 0;
    while(r1&&r2)
    {
        if(pre[r1][r2])
        {
            r2=pre[r1][r2];
            ans[++tot]=r2;
        }
        else
            --r1;
    }
    for(int i=tot;i;i--)
        printf("%d ",b[ans[i]]);
    return 0;
}


2018.10.19

原文地址:https://www.cnblogs.com/ppprseter/p/9817488.html

时间: 2024-08-30 14:46:04

凤凰院凶真 解题报告的相关文章

[CSP-S模拟测试]:凤凰院凶真(LCIS)

题目描述 $\alpha$世界线.凤凰院凶真创立了反抗$SERN$统治的组织“瓦尔基里”.为了脱离$\alpha$线,他需要制作一个世界线变动率测量仪.测量一个世界线相对于另一个世界线的变动率,实质上就是要求出这两个世界线的最长公共合法事件序列.一个世界线的事件逻辑序列是一个正整数序列,第$k$个数表示第$k$个事件发生的时间.对于一个世界线,一个合法的事件序列是事件逻辑序列的一个子序列,满足时间严格递增.现在,对于两个不同的世间线$\alpha,\beta$,求出最长的一个事件序列,满足这个序

csps-s模拟测试60嘟嘟噜,天才绅士少女助手克里斯蒂娜,凤凰院凶真题解

题面:https://www.cnblogs.com/Juve/articles/11625190.html 嘟嘟噜: 约瑟夫问题 第一种递归的容易re,但复杂度较有保证 第二种适用与n大于m的情况 第三种O(n)用于n不太大或m大于n时 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define int lon

10.5「嘟嘟噜」&#183;「天才绅士少女助手克里斯蒂娜」&#183;「凤凰院凶真」

又是一部番???? A. 嘟嘟噜 以为是个神仙题,就只打了个约瑟夫问题,然后QJ了M==2的分, 事实上因为M很小,可以让让轮数跳转,瞎算算就出来了. B. 天才绅士少女助手克里斯蒂娜 考试一开始看错题了,样例过不了异常崩溃........ 1h过去了,我读错题了(一脸震惊) 然后...好像是线段树,但不会维护....... 好像式子能拆开,wc这怎么维护??? after 10min 好像可以维护了... C. 凤凰院凶真 没时间想了,事实上是一个裸的最长公共上升子序列 考虑DP,f[i][j

【CSP模拟赛】凤凰院凶真(最长公共上升子序列)

题目描述 α世界线.凤凰院凶真创立了反抗SERN统治的组织“瓦尔基里”.为了脱离α线,他需要制作一个世界线变动率测量仪. 测量一个世界线相对于另一个世界线的变动率,实质上就是要求出这两个世界线的最长公共合法事件序列. 一个世界线的事件逻辑序列是一个正整数序列,第k个数表示第k个事件发生的时间.对于一个世界线,一个合法的事件序列是事件逻辑序列的一个子序列,满足时间严格递增. 现在,对于两个不同的世间线α,β求出最长的一个事件序列,满足这个序列在α,β世界线中均是合法的.这个序列也就是之前提到过的最

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

hdu 4956 Poor Hanamichi 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4956(它放在题库后面的格式有一点点问题啦,所以就把它粘下来,方便读者观看) 题目意思:给出一个范围 [l, r] 你, 问是否能从中找到一个数证明 Hanamichi’s solution 的解法是错的. Hanamichi’s solution 是这样的: 对于某个数 X,从右往左数它的每一位数字(假设第一位是从0开始数).它 偶数位的数字之和 -  奇数位的数字之和  = 3  而且 这个 X

【未完成0.0】Noip2012提高组day2 解题报告

第一次写一套题的解题报告,感觉会比较长.(更新中Loading....):) 题目: 第一题:同余方程 描述 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解. 格式 输入格式 输入只有一行,包含两个正整数a, b,用一个空格隔开. 输出格式 输出只有一行,包含一个正整数x0,即最小正整数解.输入数据保证一定有解. 样例1 样例输入1 3 10 样例输出1 7 限制 每个测试点1s 提示 对于40%的数据,2 ≤b≤ 1,000: 对于60%的数据,2 ≤b≤ 50,000,000:

poj 2923 Relocation 解题报告

题目链接:http://poj.org/problem?id=2923 题目意思:给出两部卡车能装的最大容量,还有n件物品的分别的weight.问以最优方式装入,最少能运送的次数是多少. 二进制表示物品状态:0表示没运走,1表示已被运走. 枚举出两辆车一趟可以运出的状态.由于物品是一趟一趟运出来的.所以就可以由一个状态通过两辆车一趟的状态转移到另一个状态. dp[i]=MIN(dp[k]+1).k可以由两车一趟转移到i. 我是参考此人的:http://blog.csdn.net/bossup/a

NOIP 2003解题报告

第一题(神经网络): 题目大意,给出一些点,每个点都有2个值,c和u,给出一些有向边,权值为w.入度为0的点的c已知,其它点的c未知,每个入度不为0的点node的c等于sum(c[k]*w[k][node]),k为与它相连(有向边指向node)的点.求所有出度为0且c>0的点. 解题过程: 此题的方法应该很多,比如拓扑排序,BFS等:我直接写了个递归,要求某个点的c,就先访问所有与它相连的点,递归下去直到 碰到入度为0的点.. 较麻烦的送分题,30分钟AC 第二题(侦探推理): 明明同学最近迷上