Uva-111-History Grading


事件の発生年はそれぞれ違っています.nつの事件が発生した年を入力して、学生の答えを入力する時、このnつの事件の年の一番長い学生にいくつか並んでいます.連続しないでください.
テーマリンク:http://uva.onlinejudge.org/index.php?option=com_オンラインjudge&Itemid=8&page=show_problem&category=114&problem=47
——>>問題の意味を理解することが重要で、入力したのは年であって、事件ではない.i番目の位置はaで、i番目の事件のa年目の発生を表す.
状態移行方程式:d[i]=max(d[i],d[j]+1)d[i]第iのイベントを終点とする最長の道を示す.
もう一つは入力方式で、初めてwhile(1){}を使って学生の答えを入力した結果、TLEになりました.第二回は学生の答えを入力した時の最初の年に変えました.残りのn-1年を入力して、AC!
#include 
#include 

using namespace std;

const int maxn = 20 + 10;

int main()
{
    int n, cmp[maxn], a[maxn], d[maxn], i, j, temp;
    scanf("%d", &n);
    for(i = 1; i <= n; i++) scanf("%d", &cmp[i]);       //  i  cmp[i]   
    while(~scanf("%d", &temp))
    {
        a[temp] = 1;
        for(i = 2; i <= n; i++)
        {
            scanf("%d", &temp);
            a[temp] = i;        //    : temp      i
        }
        for(i = 1; i <= n; i++) d[i] = 1;
        int ret = 1;
        for(i = 1; i <= n; i++)
            for(j = 1; j < i; j++)
                if(cmp[a[j]] < cmp[a[i]])
                {
                    d[i] = max(d[i], d[j]+1);
                    ret = max(ret, d[i]);
                }
        printf("%d
", ret); } return 0; }