UVA 111

又被题意坑了...

输入的一串数字的含义是第i个数字是第a[i]个发生的。而不是编号为i的历史事件的实际发生顺序。所以第一步要做的是转换,将原始数据转换成编号为i的历史事件的实际发生顺序。然后按照实际的发生顺序在aaa数组中给予权值,这是为了方便之后判断学生的答案中两个数字的相对顺序。

#include<stdio.h>
#include<string.h>
int aa[21];//存储初步转换完成后的标准事件顺序
int aaa[21];//存储标准事件顺序的权值,方便以后比较两个数的相对大小
int ttmp[21];//存储转换完成后的考生答案
int dp[21];//记录第i个数之前最长的字串
int main()
{
    int a,tmp,maxx;
    int i,j;
    scanf("%d",&a);
    for(i=1;i<=a;i++)
    {
        scanf("%d",&tmp);
        aa[tmp]=i;
    }
    for(i=1;i<=a;i++)
    {
        aaa[aa[i]]=i;
    }
    while(scanf("%d",&tmp)!=EOF)
    {
        ttmp[tmp]=1;
        for(i=1;i<=a;i++)
        {
            dp[i]=1;
        }
        for(i=2;i<=a;i++)
        {
            scanf("%d",&tmp);
            ttmp[tmp]=i;
        }
        for(i=2;i<=a;i++)
        {
            maxx=0;
            for(j=i;j>=1;j--)
            {
                if(aaa[ttmp[i]]>aaa[ttmp[j]]&&maxx<dp[j])
                {
                    maxx=dp[j];
                    if(dp[j]>=j)
                        break;
                }
            }
            dp[i]+=maxx;
        }
        maxx=0;
        for(i=1;i<=a;i++)
        {
            if(maxx<dp[i])
                maxx=dp[i];
        }
        printf("%d\n",maxx);
    }
    return 0;
}
时间: 2024-10-07 20:41:21

UVA 111的相关文章

uva 111 History Grading(DP初步应用)

uva 111 History Grading 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

UVA 111 简单DP 但是有坑

题目传送门:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18201 其实是一道不算难的DP,但是搞了好久,才发现原来是题目没读清楚,囧,原序列那里简直太坑了, 看了别人好多的都是用最长公共子序列,但是我用的是最长上升子序列来做,就是将原序列逐渐递增映射成递增的数列,这道题目的数据恰好符合这个条件 比如正确的序列为$$5 \ 6 \ 4  \ 1 \  3 \  2$$,我就可以将他一一映射成为 $$ID[5]\right

UVA 111 History Grading (最长公共子序列)

History Grading Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Background Many problems in Computer Science involve maximizing some measure according to constraints. Consider a history exam in which students are asked to put s

uva 111 - History Grading (dp, LCS)

题目链接 题意:给N,第二行是答案,n个数c1---cn, 代表第一个的顺序是c1,第二个数顺序是c2; 下面每一行是学生的答案,格式同上. 注意:这个给的顺序需要处理一下,不能直接用. 思路:LCS. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespac

UVa 111 - History Grading

题目:历史上有一些事件发生的先后顺序,现在有很多学生写了不同的顺序表, 判断每个学生的最大的前后顺序正确的序列. 分析:dp,LIS,最大上升子序列. 注意本题的数据格式,串里的每个元素对应于:对应下标编号的事件在表中的位置: 状态:F(n)记录以第n个元素为结束元素的序列的最长上升子序列,有转移方程: F(n)= max(F(i)+1)  { 其中 0 < i < n 且 data[i] < data[n] }. 说明:发现好多dp题(⊙_⊙). #include <iostre

UVA 111 History Grading 【lcs】

Brief Description: 一个历史考试,有n个历史事件, 它们之间的年份是不同的,要学生把这些事件按照正确的顺序排列出来.有两种记分方式,采用的是第二种: 假设有历史事件1,2,3,4, 它们正确的时间顺序是1,2,3,4, 然后假设学生的答案是1,3,2,4, 那么按照相对顺序正确的数量,答对了三个(1,2,4或者1,3,4),也就是它与正确答案的最长公共子序列长度是3,便是答对的数量. Analyse: 最长公共子序列模板题,但是这题的输入是个很大的坑,他的输入是按照顺序,事件1

简单Dp----最长公共子序列,DAG最长路,简单区间DP等

/* uva 111 * 题意: * 顺序有变化的最长公共子序列: * 模板: */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[100]; int mu[100]; int Dp[100][100]; int main() { int n,x; scanf("%d", &n

ACM总结——dp专辑(转)

感谢博主——      http://blog.csdn.net/cc_again?viewmode=list       ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ***********************

【DP专辑】ACM动态规划总结

转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ******************