Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 1590 | Accepted: 766 |
Description
Input
Output
Sample Input
1 5 10 20 3 4 5 10 20 8 18 19
Sample Output
22
Source
/* 三维数组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; }