UVa 116 - Unidirectional TSP
2013-06-12 16:33
465 查看
/* DP : 从右往左递推,方便字典序打印。 */ #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int MAXM = 15; const int MAXN = 105; int m, n; int A[MAXM][MAXN]; int d[MAXN][MAXM]; int s[MAXN][MAXM]; void print(int i, int j) { if(i==n) {printf("%d", j); return;} printf("%d ", j); print(i+1, s[i][j]); } void dp() { for(int i=1; i<=m; i++) { d [i] = A[i] ; } for(int i=n-1; i>=1; i--) { for(int j=1; j<=m; j++) { int &cur = d[i][j]; int &idx = s[i][j]; cur = d[i+1][j]; idx = j; int row = (j+m-2)%m + 1; int temp = d[i+1][row]; if(temp < cur || (temp == cur && row < idx)) { cur = temp; idx = row; } row = j%m + 1; temp = d[i+1][row]; if(temp < cur || (temp == cur && row < idx)) { cur = temp; idx = row; } cur += A[j][i]; } } } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); #endif while(scanf("%d%d", &m, &n) == 2) { for(int i=1; i<=m; i++) { for(int j=1; j<=n; j++) { scanf("%d", &A[i][j]); } } dp(); int val = d[1][1]; int idx = 1; for(int i=2; i<=m; i++) { if(d[1][i] < val) { val = d[1][i]; idx = i; } } print(1, idx); printf("\n%d\n", val); } return 0; }
相关文章推荐
- UVA 116——Unidirectional TSP
- UVA 116 Unidirectional TSP
- UVA 116_ Unidirectional TSP
- UVA 116 Unidirectional TSP
- UVA 116 Unidirectional TSP
- UVa 116 - Unidirectional TSP
- UVa OJ 116 - Unidirectional TSP
- DP--UVA - 116 Unidirectional TSP
- 【DP】UVA 116 Unidirectional TSP
- UVA 116 Unidirectional TSP
- UVa 116 - Unidirectional TSP
- 【DP】UVA 116 Unidirectional TSP
- UVA116 Unidirectional TSP
- uva 116 - Unidirectional TSP
- UVa116 Unidirectional TSP
- 单向TSP(unidirectional TSP,UVa 116)
- UVA 116 Unidirectional TSP
- UVa 116 Unidirectional TSP
- uva 116 Unidirectional TSP
- Uva 116 Unidirectional TSP