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.弄个临时变量记录最 ...
随机推荐
- [OpenCV] Face Detection
即将进入涉及大量数学知识的阶段,先读下“别人家”的博文放松一下. 读罢该文,基本能了解面部识别领域的整体状况. 后生可畏. 结尾的Google Facenet中的2亿数据集,仿佛隐约听到:“你们都玩儿 ...
- 使用命令行备份指定文件夹并保留最新N份
客户需要对网站进行定期备份,并保留最近30天的文件,编写后以下脚本,通过Windows的任务计划进行调度 对比手工和任务计划调度运行情况来看,手工运行中可直接调用RAR.exe和网络进行传输,但是任务 ...
- Node.app – 用于 iOS App 开发的 Node.js 解释器
Node.app 是用于 iOS 开发的 Node.js 解释器,它允许最大的代码重用和快速创新,占用资源很少,为您的移动应用程序提供 Node.js 兼容的 JavaScript API.你的客户甚 ...
- iOS- 微信支付 (服务器调起支付 )以及回调不成功的原因 不看后悔
写的不错,给留个言哈... 一. 支付准备工作 1. 微信相关准备工作 (1) 向微信官方开通支付功能. 这个不是前端的工作. (2) 导入官方下载的微信支付SDK包. 我用的是微信开放平台下载的SD ...
- iOS-开发技巧-页面布局
#pragma mark - Life Cycle//1.初始化//2.view did load//3.view will appear…#pragma mark - System Delegate ...
- ASP.NET WebForm与MVC优缺点
发表于我的个人网站中,请点击阅读!
- mysqldump导出部分数据的方法: 加入--where参数
mysqldump导出部分数据的方法: 加入--where参数 mysqldump -u用户名 -p密码 数据库名 表名 --where="筛选条件" > 导出文件路径 my ...
- Scrum 3.2 多鱼点餐系统开发进度(页面优化&下单详细信息页面)
Scrum 3.2 多鱼点餐系统开发进度(页面优化&下单详细信息页面) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选 ...
- Linq专题之Lambda表达式
这一节我们讲的Lambda表达式跟匿名函数有关.Lambda表达式就是一个匿名函数,它可以包含表达式和语句,并且可以创建委托和表达式树. Lambda表达式的组成: 输入参数.Lambda运算符(=& ...
- WebService服务调用方法介绍
1 背景概述 由于在项目中需要多次调用webservice服务,本文主要总结了一下java调用WebService常见的6种方式,即:四种框架的五种调用方法以及使用AEAI ESB进行调用的方法. 2 ...