【HDOJ】1619 Unidirectional TSP

题目本身一点儿都不难,但是就是被字典序搞死了。写的挺麻烦,但是过了,逆向做好做一点儿。

  1 /* 1619 */
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 
  6 #define MAXN 15
  7 #define MAXM 105
  8 #define INF    9999999
  9 
 10 int dp[MAXN][MAXM];
 11 int path[MAXN][MAXM];
 12 int map[MAXN][MAXM];
 13 int stack[MAXM], top;
 14 int d[3];
 15 int ans;
 16 int n, m;
 17 
 18 void solve(int beg) {
 19     int i, j, k, tmp;
 20 
 21     for (i=0; i<n; ++i)
 22         dp[i][m-1] = INF;
 23     dp[beg][m-1] = map[beg][m-1];
 24     path[beg][m-1] = -1;
 25 
 26     for (j=m-2; j>=0; --j) {
 27         for (i=0; i<n; ++i) {
 28             if (i == 0)
 29                 d[0] = n - 1;
 30             else
 31                 d[0] = i - 1;
 32             d[1] = i;
 33             if (i == n-1)
 34                 d[2] = 0;
 35             else
 36                 d[2] = i + 1;
 37             if (dp[d[0]][j+1] == dp[d[1]][j+1]) {
 38                 k = d[0]<d[1] ? d[0]:d[1];
 39                 if (dp[k][j+1] == dp[d[2]][j+1])
 40                     k = k<d[2] ? k:d[2];
 41                 else if (dp[k][j+1] < dp[d[2]][j+1])
 42                     k = k;
 43                 else
 44                     k = d[2];
 45             } else if (dp[d[0]][j+1] < dp[d[1]][j+1]) {
 46                 if (dp[d[0]][j+1] == dp[d[2]][j+1])
 47                     k = d[0]<d[2] ? d[0]:d[2];
 48                 else if (dp[d[0]][j+1] < dp[d[2]][j+1])
 49                     k = d[0];
 50                 else
 51                     k = d[2];
 52             } else {
 53                 if (dp[d[1]][j+1] == dp[d[2]][j+1])
 54                     k = d[1]<d[2] ? d[1]:d[2];
 55                 else if (dp[d[1]][j+1] < dp[d[2]][j+1])
 56                     k = d[1];
 57                 else
 58                     k = d[2];
 59             }
 60             path[i][j] = k;
 61             dp[i][j] = dp[k][j+1];
 62             if (dp[i][j] != INF)
 63                 dp[i][j] += map[i][j];
 64         }
 65     }
 66 
 67     tmp = INF;
 68     for (i=0; i<n; ++i) {
 69         if (dp[i][0] < tmp) {
 70             tmp = dp[i][0];
 71             k = i;
 72         }
 73     }
 74 
 75     if (tmp < ans) {
 76         ans = tmp;
 77         top = 0;
 78         j = 0;
 79         stack[top++] = k + 1;
 80         while (path[k][j] >= 0) {
 81             stack[top++] = path[k][j] + 1;
 82             k = path[k][j];
 83             ++j;
 84         }
 85     }
 86 }
 87 
 88 int main() {
 89     int i, j, k, tmp;
 90 
 91     #ifndef ONLINE_JUDGE
 92         freopen("data.in", "r", stdin);
 93         freopen("data.out", "w", stdout);
 94     #endif
 95 
 96     while (scanf("%d %d", &n, &m) != EOF) {
 97         for (i=0; i<n; ++i)
 98             for (j=0; j<m; ++j)
 99                 scanf("%d", &map[i][j]);
100         ans = INF;
101         for (i=0; i<n; ++i)
102             solve(i);
103 
104         for (i=0; i<m-1; ++i)
105             printf("%d ", stack[i]);
106         printf("%d
", stack[m-1]);
107         printf("%d
", ans);
108     }
109 
110     return 0;
111 }
原文地址:https://www.cnblogs.com/bombe1013/p/4231657.html