題意:數組
你有一個小站,車站最多能同時接納三輛火車。先進的火車必須先出。容許同時有多輛火車進出站。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 }