天天看點

URAL 1078. Segments(記錄路徑的簡單dp)

題目意思是給你n條線段讓你求出有多少線段是覆寫的。按右邊與左邊排一下序,然後就是一個“求最長上升序列”了啊。然後要列印路徑,列印路徑想麻煩了啊、、wa了啊幾次、、sad啊、、

ps:special judge。

078. Segments

Time limit: 1.0 second

Memory limit: 64 MB

A number of segments are lying on a line. Every segment is given with the coordinates of its endpoints. Segments are numbered from 1 to  N (0 <  N < 500). We assume, that one segment is inside another, if the two segments are different, the first one is fully contained in the second one, and their endpoints do not coincide. Write a program, which finds the numbers of the segments in the longest sequence of segments which are contained in. In the sequence, every segment except the last is inside the next segment in the sequence.

Input

The first line contains one integer  N. Next, there are  N lines, with two integers on every line, which are the coordinates of the left and the right endpoints of the corresponding segment. These coordinates are integers in the interval [–10000, 10000]. We assume that, the given segments are numbered according to their place in the input.

Output

The first line must contain one integer, equal to the number of segments in the found sequence. The following line must contain the numbers of the segments in this sequence. These numbers must be outputted, in the order in which the segments' lengths increase, starting from the smallest. If there are more than one output sequences, write any of them.

Sample

input output
4
-2 2
-1 1
-3 3
4 5
      
3
2 1 3
      
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define eps 1e-7
#define M 1000100
#define LL __int64
//#define LL long long
#define INF 0x3fffffff
#define PI 3.1415926535898

using namespace std;

const int maxn = 510;

struct node
{
    int l, r;
    int num;
} f[maxn];

int dp[maxn];
int pre[maxn];
int ff[maxn];

bool cmp(node a, node b)
{
    if(a.r == b.r)
        return a.l < b.l;
    return a.r < b.r;
}

int main()
{
    int n;
    while(cin >>n)
    {
        for(int i = 1; i <= n; i++)
        {
            cin >>f[i].l>>f[i].r;
            f[i].num = i;
        }
        sort(f+1, f+n+1, cmp);
        memset(pre, -1, sizeof(pre));
        for(int i = 1; i <= n; i++)
            dp[i] = 1;
        for(int i = 2; i <= n; i++)
        {
            for(int j = i-1; j >= 1; j--)
            {
                if(f[i].r > f[j].r && f[i].l < f[j].l)
                {
                    if(dp[i] < dp[j]+1)
                    {
                        dp[i] = dp[j]+1;
                        pre[i] = j;
                    }
                }
            }
        }
        int Max = -1;
        int p;
        for(int i = 1; i <= n; i++)
        {
            if(dp[i] > Max)
            {
                Max = dp[i];
                p = i;
            }
        }
        cout<<Max<<endl;
        int t = 0;
        int s = p;
        while(s != -1)
        {
            ff[t++] = s;
            s = pre[s];
        }
        for(int i = t-1; i > 0; i--)
            cout<<f[ff[i]].num<<" ";
        cout<<f[ff[0]].num<<endl;
    }
    return 0;
}
/*
Test case 2:
9
-1 1
-2 2
-3 3
-10 10
3 6
4 5
2 7
1 8
0 9
Answer:
6
6 5 7 8 9 4

Test case 3:
100
272 422
352 367
102 435
274 469
532 554
88 468
28 761
334 381
62 236
858 955
104 930
4 892
467 749
39 695
189 709
217 790
571 999
126 355
138 779
570 645
31 222
372 511
345 888
535 731
435 953
87 869
172 863
442 936
450 704
452 697
862 896
887 977
510 844
135 225
95 932
632 888
30 704
165 523
47 306
107 645
22 34
237 712
779 796
505 964
419 495
171 751
449 616
62 642
355 954
101 266
71 585
284 723
69 900
781 998
21 338
619 950
173 239
394 502
183 605
113 999
30 748
122 833
541 829
65 453
650 741
141 562
355 928
360 852
83 997
563 590
482 668
318 980
84 170
233 858
9 484
637 799
104 611
483 856
29 889
16 463
530 709
774 979
414 654
332 527
406 476
257 735
57 257
201 508
259 806
62 955
410 790
37 720
490 893
573 779
241 400
315 640
242 940
165 929
54 814
356 501
Answer:
13
2 8 95 88 38 66 77 48 14 92 61 79 12
*/