UVa 111 - History Grading (by 最长公共子序列 )
| History Grading |
Background
Many problems in Computer Science involve maximizing some measure according to constraints.
Consider a history exam in which students are asked to put several historical events into chronological order. Students who order all the events correctly will receive full credit, but how should partial credit be awarded to students who incorrectly rank one or more of the historical events?
Some possibilities for partial credit include:
- 1 point for each event whose rank matches its correct rank
- 1 point for each event in the longest (not necessarily contiguous) sequence of events which are in the correct order relative to each other.
For example, if four events are correctly ordered 1 2 3 4 then the order 1 3 2 4 would receive a score of 2 using the first method (events 1 and 4 are correctly ranked) and a score of 3 using the second method (event sequences 1 2 4 and 1 3 4 are both in the correct order relative to each other).
In this problem you are asked to write a program to score such questions using the second method.
The Problem
Given the correct chronological order of n events
as
where
denotes the ranking of event i in the correct chronological order and a sequence of student responses
where
denotes the chronological rank given by the student to event i; determine the length of the longest (not necessarily contiguous) sequence of events in the student responses that are in the correct chronological order relative to each other.
The Input
The first line of the input will consist of one integer n indicating the number of events with
. The second line will containn integers, indicating the correct chronological order of n events. The remaining lines will each consist of n integers with each line representing a student's chronological ordering of the n events. All lines will contain n numbers in the range
, with each number appearing exactly once per line, and with each number separated from other numbers on the same line by one or more spaces.
The Output
For each student ranking of events your program should print the score for that ranking. There should be one line of output for each student ranking.
Sample Input 1
4
4 2 3 1
1 3 2 4
3 2 1 4
2 3 4 1
Sample Output 1
1
2
3
Sample Input 2
10
3 1 2 4 9 5 10 6 8 7
1 2 3 4 5 6 7 8 9 10
4 7 2 3 10 6 9 1 5 8
3 1 2 4 9 5 10 6 8 7
2 10 1 3 8 4 9 5 7 6
Sample Output 2
6
5
10
9
解题思路:
最长公共子序列的应用.之前已经有过一些相对应的练习,不过这道题关于历史时间的时间排序.其中输入的序列并不一定代表着时间的顺序,而是代表着事件i发生的位置在哪里.
注意,给出的序列和一般理解上的出现次序是不同的。比如4 2 3 1,一般理解是第4个事件在第1位,第2个事件在第2位,第1个事件在第4位。但在这道题目,序列的含义是第1个事件在第4位,第2个事件在第2位,第4个事件在第一位。为方便计算,需要对输入的序列进行转换,使数字对号入座。比如一个正确的序列是:
| 正确答案 | 学生答案 | 含义 | |
| 输入的序列 | 3 1 2 4 9 5 10 6 8 7 | 2 10 1 3 8 4 9 5 7 6 | 历史事件发生在第几位 |
| 转换后的序列 | 2 3 1 4 6 8 10 9 5 7 | 3 1 4 6 8 10 9 5 7 2 | 发生了第几个历史事件 |
接下来就用转换后的序列进行计算。为了方便的看出学生答案的顺序是否正确,应该按照正确答案与1 2 ... 10的对应关系将学生答案再做一次转换。正确答案中第2个历史件事发生在第1位,那么学生答案中的2应转换为1;即3转换为2,以此类推。学生答案就转换为最终的序列为:
| 编号 | 1 2 3 4 5 6 7 8 9 10 |
| 序列 | 2 3 4 5 6 7 8 9 10 1 |
显而易见,这个序列的最长有序子串(非连序)的长度为9。要将输入的正确答案序列和学生答案序列都依次做上述转换就显得非常麻烦了,其实正确答案序列是无需转换的。假设正确答案序列为A,学生答案序列为B,则发生在第Bi位的历史事件的最终位置就应该是Ai。这样就可以一次完成全部转换。
接下来就是要找出最长有序子串。因为正确的顺序是由小至大,所以从最后一位开始遍例。依次找出每个数之后(含自身)的最长有序子串长度Mi,然后找最Mi中的最大值即为解。观查下面的序列:
| 编号 | 1 2 3 4 5 6 7 8 9 10 |
| 序列 | 5 8 3 7 6 1 9 2 10 4 |
因此在进行传入的参数应该是变换之后的数组。
对于如何将编号转化为序列号.很简单的操作:
for(int i=; i<=n; i++)
{
cin>>loc;//事件i发生的位置loc
x[loc]=i;//
}
完整代码:
#include <bits/stdc++.h>
const int MAX=;
int x[MAX];
int y[MAX];
int DP[MAX][MAX];
int b[MAX][MAX];
int n,i,j,loc; using namespace std; void work(int x[],int y[],int n)
{
memset(DP,,sizeof(DP));
for(i=; i<=n; i++)
{
for(j=; j<=n; j++)
{
if(x[i]==y[j])
{
DP[i][j]=DP[i-][j-]+;
}
else
DP[i][j]=max(DP[i-][j],DP[i][j-]);
}
}
cout<<DP[n][n]<<endl;
} int main()
{
scanf("%d",&n);
for(int i=; i<=n; i++)
{
cin>>loc;
x[loc]=i;
}
while(~scanf("%d",&loc))//avoid TLE
{
y[loc]=;
for(int j=; j<=n; j++)
{
cin>>loc;
y[loc]=j;
}
work(x,y,n);
memset(y,,sizeof(y));
}
return ;
}
UVa 111 - History Grading (by 最长公共子序列 )的更多相关文章
- uva 111 History Grading(最长公共子序列)
题目连接:111 - History Grading 题目大意:给出一个n 代表序列中元素的个数, 然后是一个答案, 接下来是若干个同学的答案(直到文件结束为止), 求出两个序列的最长公共子序列, 注 ...
- UVA 111 History Grading
读题读了好久,其实就是在输入数据时要对数据的位置进行相应的改变 #include<iostream> #include<cstring> #include<cstdio& ...
- uva 111 History Grading(lcs)
题目描述 在信息科学中有一些是关于在某些条件限制下,找出一些计算的最大值. 以历史考试来说好了,学生被要求对一些历史事件根据其发生的年代顺序来排列.所有事件顺序都正确的学生无疑的可以得满分.但是那些没 ...
- uva 111 - History Grading (dp, LCS)
题目链接 题意:给N,第二行是答案,n个数c1---cn, 代表第一个的顺序是c1,第二个数顺序是c2; 下面每一行是学生的答案,格式同上. 注意:这个给的顺序需要处理一下,不能直接用. 思路:LCS ...
- UVa 111 History Grading (简单DP,LIS或LCS)
题意:题意就是坑,看不大懂么,结果就做不对,如果看懂了就so easy了,给定n个事件,注意的是, 它给的是第i个事件发生在第多少位,并不是像我们想的,第i位是哪个事件,举个例子吧,4 2 3 1, ...
- UVA 10405最长公共子序列
裸最长公共子序列,直接贴代码 #include<cstdio> #include<iostream> #include<algorithm> #include< ...
- UVA - 10635 最长公共子序列
input n,p,q 2<=n<=250 1<=p,q<=n*n 1 a1 a2 a3 ... ap 1<ai<n*n,ai!=aj 1 b1 b2 b3 ... ...
- UVA 1045 最长公共子序列
题目描述:求最长公共子序列 若给定序列X={x1,x2,...,xm},另一序列Z={z1,z2,...,zk},是X的子序列是指存在一个严格递增的下标序列{i1,i2,...,ik}使得对所以j=1 ...
- UVA 12511/CSU 1120 virus 最长公共上升子序列
第一次接触一个这最长公共上升子序列 不过其实搞清楚了跟最长公共子序列和 最长上升子序列如出一辙 两重循环,对于当前不相等的,等于前一个的值,相等的,等于比当前A[i]小的最大值+1.弄个临时变量记录最 ...
随机推荐
- 左倾堆(一)之 图文解析 和 C语言的实现
概要 本章介绍左倾堆,它和二叉堆一样,都是堆结构中的一员.和以往一样,本文会先对左倾堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理 ...
- [Python] Basic operations in Pycharm
From: http://learnpythonthehardway.org/book Comment with line comment: Ctrl + slash Run: Shift + F10 ...
- extractCSS – 帮助你从 HTML 中快速分离出 CSS
extractCSS 是一个免费的基于 Web 的应用程序,能够从 HTML 中提取风格相关的信息,包括 id.class 和内联样式,而且输出可以定制(缩进和括号的用法).该工具非常有用,当我们快速 ...
- [编辑器]走上atom之路1
祝大家新年快乐 我就是来卖个萌,逃- 正文 我最开始用atom是因为它看起来比较酷,我工作中主力还是使用pycharm,毕竟atom只是一个编辑器.我一 般只是用atom来写Markdown的文件.随 ...
- 使用“原生”HTML DOM获取input的输入值并显示
理论基础 HTML <input> value属性.value规定<input>元素的值.value对于不同input类型,用法也不同. 1.对于"button&qu ...
- 三种对话框的示例(alert,confirm,prompt)
示例代码 <h2>JavaScriptDialog</h2> <hr/> <buttononclick="btn_alert()"> ...
- IIS 503日志文件在哪
概述 503:“服务不可用”错误是一个非自定义的错误,该错误表示服务器当前无法处理该请求. 可能原因:1.管理员可能关闭应用程序池以执行维护.2.当请求到达时应用程序池队列已满.3.应用程序池标识没 ...
- 购买SSL证书到部署网站遇到的若干问题
作为一个菜鸟,对于SSL证书,我了解不多,只知道用了它网站更安全,所以这次使用SSL证书途中遇到了各方面的各种问题,到今天为止终于全部解决. 一.证书格式 前两天在那什么云上面买了个SSL证书,是Wo ...
- CRC16校验码生成
/// <summary> /// 计算CRC-16 /// </summary> /// <param name="data"></pa ...
- C# on Visual Studio Code
installation Download .NET Core SDK installer and install it. https://www.microsoft.com/net/download ...