/*
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[n][i] = A[i][n];
}
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
最新推荐文章于 2024-05-19 14:17:10 发布
