【状压dp】P2157 [SDOI2009]学校食堂

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 const int INF = 0x3f3f3f3f;
 9 
10 int n, t[1010], b[1010], f[1010][256][20];
11 
12 int main() 
13 {
14     int T;
15     cin >> T;
16     while (T--)
17     {
18         cin >> n;
19         for (int i = 1; i <= n; i++)
20         {
21             cin >> t[i] >> b[i];
22         }
23         memset(f, 0x3f, sizeof(f));
24         f[1][0][7] = 0;
25         for (int i = 1; i <= n; i++)
26             for (int j = 0; j < 256; j++)
27                 for (int k = -8; k <= 7; k++)
28                     if (f[i][j][k + 8] != INF)
29                     {
30                         if (j & 1) f[i + 1][j >> 1][k + 7] = min(f[i + 1][j >> 1][k + 7], f[i][j][k + 8]);
31                         else
32                         {
33                             int l = INF;
34                             for (int h = 0; h <= 7; h++) 
35                                 if (!((j >> h) & 1))
36                                 {
37                                     if (i + h > l) break;
38                                     l = min(l, i + h + b[i + h]);
39                                     f[i][j | (1 << h)][h + 8] = min(f[i][j | (1 << h)][h + 8], f[i][j][k + 8] + (i + k ? (t[i + k] ^ t[i + h]) : 0));
40                                 }
41                         }
42                     }
43         int mint = INF; 
44         for (int i = 0; i <= 8; i++)
45             mint = min(mint, f[n + 1][0][i]);
46         cout << mint << endl;
47     }
48 }
View Code

猜你喜欢

转载自www.cnblogs.com/thjkhdf12/p/11641169.html