UVa 10131 - Is Bigger Smarter?
                                            
 10801 단어  uva
                    
AC 이후에 검색해 봤는데 몇 개는 최대 하강 서열로 이해했지만 dp의 연습 문제로서 DAG로 바뀌었고 복잡도는 당연히 높았지만 시간을 초과하지 않았다.
 1 # include <stdio.h>
 2 
 3 int n;
 4 int w[1000];
 5 int s[1000];
 6 int d[1000];
 7 int g[1000][1000];
 8 
 9 int dp(int i);
10 void print_list(int i);
11 
12 int main()
13 {
14     int i, j, maxl, k;
15     
16     n = 1;
17     while (~scanf("%d%d", &w[n], &s[n]))
18         ++n;
19        --n;
20        for (i = 1; i <= n; ++i)
21        for (j = 1; j <= n; ++j)
22            if (w[i]<w[j] && s[i]>s[j])
23                g[i][j] = 1;
24     maxl = 0;
25     for (i = 1; i <= n; ++i)
26         if (maxl < dp(i)) {maxl = d[i]; k = i;}
27        
28        printf("%d
", maxl+1);
29        print_list(k);
30     
31     return 0;
32 }
33 
34 int dp(int i)
35 {
36     int j;
37     if (d[i] > 0) return d[i];
38     d[i] = 0;
39     for (j = 1; j <= n; ++j)
40         if (g[i][j] && d[i]<dp(j)+1) d[i] = d[j]+1;
41        return d[i];
42 }
43 void print_list(int i)
44 {
45     int j;
46     printf("%d
", i);
47     for (j = 1; j <= n; ++j)
48         if (g[i][j] && d[i] == d[j]+1)
49            {
50                print_list(j);
51                break;
52         }
53 }생각해 보니 건도의 과정을 생략하고 직접 판단하면 된다.
 1 # include <stdio.h>
 2 
 3 int n;
 4 int w[1000];
 5 int s[1000];
 6 int d[1000];
 7 
 8 int dp(int i);
 9 void print_list(int i);
10 
11 int main()
12 {
13     int i, j, maxl, k;
14         
15     n = 1;
16     while (~scanf("%d%d", &w[n], &s[n]))
17         ++n;
18        --n;
19     maxl = 0;
20     for (i = 1; i <= n; ++i)
21         if (maxl < dp(i)) {maxl = d[i]; k = i;}
22        
23        printf("%d
", maxl+1);
24        print_list(k);
25     
26     return 0;
27 }
28 
29 int dp(int i)
30 {
31     int j;
32     if (d[i] > 0) return d[i];
33     d[i] = 0;
34     for (j = 1; j <= n; ++j)
35         if (w[i]<w[j] && s[i]>s[j] && d[i]<dp(j)+1) d[i] = d[j]+1;
36        return d[i];
37 }
38 void print_list(int i)
39 {
40     int j;
41     printf("%d
", i);
42     for (j = 1; j <= n; ++j)
43         if (w[i]<w[j] && s[i]>s[j] && d[i] == d[j]+1)
44            {
45                print_list(j);
46                break;
47         }
48 }이렇게 하면 적지 않은 공간을 절약하지만 시간의 복잡도는 변하지 않는다(O(n*n).
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
UVA - 10986 Sending email(Dijkstra 인접 테이블 + 우선 순위 대기열 최적화)제목 대의: s점에서 t점까지의 최소 거리를 구하는 그림을 주세요. 확인: 적나라한 최단길이지만 n이 너무 크면 인접 행렬을 사용할 수 없기 때문에 Dijkstra에 대한 인접표 + 우선 대기열 최적화가 필요합니다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.