poj 1695 Magazine Delivery

 

Magazine Delivery
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 1590   Accepted: 766

Description

The TTT Taxi Service in Tehran is required to deliver some magazines to N locations in Tehran. The locations are labeled L1 to LN. TTT assigns 3 cars for this service. At time 0, all the 3 cars and magazines are located at L1. There are plenty of magazines available in L1 and the cars can take as many as they want. Copies of the magazine should be delivered to all locations, observing the following rules: 
  1. For all i = 2 .. N, magazines should be delivered at Li only after magazines are delivered at Li-1 . 
  2. At any time, only one of the three cars is driving, and the other two are resting in other locations.

The time to go from Li to Lj (or reverse) by any car is a positive integer denoted by D[i , j]. 
The goal is to organize the delivery schedule for the cars such that the time by which magazines are delivered to all N locations is minimum. 
Write a program to compute the minimum delivery time. 

Input

The input file contains M instances of this problem (1 <= M <= 10). The first line of the input file is M. The descriptions of the input data follows one after the other. Each instance starts with N in a single line (N <= 30). Each line i of the following N-1 lines contains D[i , j], for all i=1..N-1, and j=i+1..N.

Output

The output contains M lines, each corresponding the solution to one of the input data. In each line, the minimum time it takes to deliver the magazines to all N locations is written.

Sample Input

1
5
10 20 3 4
5 10 20
8 18
19

Sample Output

22

Source

Tehran 1999

 

/* 三维数组DP,假设第一辆车所在位置大于第二辆车位置大于第三辆车位置 则如果当前dp[i][j][k]已经计算过,那么 (1)第一辆车开到i + 1, dp[i + 1][j][k] = min{dp[i + 1][j][k], dp[i][j][k] + cost[i][i + 1]}; (2)第二辆车开到i + 1, dp[i + 1][i][k] = min{dp[i + 1][i][k], dp[i][j][k] + cost[j][i + 1]}; (3)第三辆车开到i + 1, dp[i + 1][i][j] = min{dp[i + 1][i][j], dp[i][j][k] + cost[k][i + 1]}. */ #include <iostream> #define minv(a, b) ((a) <= (b) ? (a) : (b)) #define MAX_N 30 int dp[MAX_N + 1][MAX_N + 1][MAX_N + 1]; int cost[MAX_N + 1][MAX_N + 1], n; int minCost; bool can(int i, int j, int k) { return i <= n && i >= j && j >= k; } void dpSolve() { int i, j, k; for(k = 1; k <= n; k++) { for(j = k; j <= n; j++) { for(i = j; i <= n; i++) { if(dp[i][j][k] == INT_MAX) continue; if(can(i + 1, j, k)) { dp[i + 1][j][k] = minv(dp[i + 1][j][k], dp[i][j][k] + cost[i][i + 1]); if(i + 1 == n && dp[i + 1][j][k] < minCost) minCost = dp[i + 1][j][k]; } if(can(i + 1, i, k)) { dp[i + 1][i][k] = minv(dp[i + 1][i][k], dp[i][j][k] + cost[j][i + 1]); if(i + 1 == n && dp[i + 1][i][k] < minCost) minCost = dp[i + 1][i][k]; } if(can(i + 1, i, j)) { dp[i + 1][i][j] = minv(dp[i + 1][i][j], dp[i][j][k] + cost[k][i + 1]); if(i + 1 == n && dp[i + 1][i][j] < minCost) minCost = dp[i + 1][i][j]; } } } } } int main() { int caseNum, i, j, k, w; scanf("%d", &caseNum); while(caseNum--) { minCost = INT_MAX; scanf("%d", &n); for(i = 1; i <= n; i++) for(j = 1; j <= n; j++) { cost[i][j] = 0; for(k = 1; k <= n; k++) dp[i][j][k] = INT_MAX; } for(i = 1; i <= n - 1; i++) { for(j = i + 1; j <= n; j++) { scanf("%d", &w); cost[i][j] = cost[j][i] = w; } } dp[1][1][1] = 0; dpSolve(); printf("%d/n", minCost); } return 0; } 

你可能感兴趣的:(poj 1695 Magazine Delivery)