火車進站

題意:數組

你有一個小站,車站最多能同時接納三輛火車。先進的火車必須先出。容許同時有多輛火車進出站。ide

給定n<=100個火車的進出站時刻,沒必要一一接納,求最多能接納多少火車。spa

解:code

因爲是個DP,我一開始想的是把時間離散化以後按照時間來。blog

f[i][j][k][l]表示前i輛火車,三條軌道的最後時刻分別是jkl時的最大接納量。it

而後發現數組開不下...而後發現哪來三個軌道啊,只有一個......io

而後發現網上竟然有題解。event

設f[i][j][k]表示車站內的順序是k->j->i,i最早來。class

而後枚舉由j->i->p的狀況轉移過來。cli

記得判斷當前狀態是否合法。

 1 #include <cstdio>
 2 #include <algorithm>
 3 
 4 const int N = 110;
 5 
 6 int f[N][N][N];
 7 std::pair<int, int> a[N];
 8 
 9 int main() {
10     int n, m;
11     scanf("%d%d", &n, &m);
12     for(int i = 1; i <= n; i++) {
13         scanf("%d%d", &a[i].first, &a[i].second);
14     }
15     std::sort(a + 1, a + n + 1);
16     int ans = 1;
17     if(m == 1) {
18         for(int i = 1; i <= n; i++) {
19             f[i][0][0] = 1;
20             for(int j = 1; j < i; j++) {
21                 if(a[j].second <= a[i].first) {
22                     f[i][0][0] = std::max(f[i][0][0], f[j][0][0] + 1);
23                 }
24             }
25             ans = std::max(ans, f[i][0][0]);
26         }
27         printf("%d", ans);
28         return 0;
29     }
30     if(m == 2) {
31         for(int i = 1; i <= n; i++) {
32             for(int j = i + 1; j <= n; j++) {
33                 if(a[i].second > a[j].second) {
34                     continue;
35                 }
36                 f[i][j][0] = 2;
37                 for(int k = 1; k < i; k++) { /// j - i - k
38                     if(a[k].second <= a[j].first) {
39                         f[i][j][0] = std::max(f[i][j][0], f[k][i][0] + 1);
40                     }
41                 }
42                 ans = std::max(ans, f[i][j][0]);
43             }
44         }
45         printf("%d", ans);
46         return 0;
47     }
48     for(int i = 1; i <= n; i++) {
49         for(int j = i + 1; j <= n; j++) {
50             if(a[i].second > a[j].second) {
51                 continue;
52             }
53             for(int k = j + 1; k <= n; k++) {
54                 if(a[j].second > a[k].second) {
55                     continue;
56                 }
57                 f[i][j][k] = 3;
58                 for(int p = 1; p < i; p++) { // k - j - i - p
59                     if(a[p].second <= a[k].first) {
60                         f[i][j][k] = std::max(f[i][j][k], f[p][i][j] + 1);
61                     }
62                 }
63                 ans = std::max(ans, f[i][j][k]);
64             }
65         }
66     }
67     printf("%d", ans);
68     return 0;
69 }
AC代碼
相關文章
相關標籤/搜索