您的位置:首页 > 其它

Uva--116 Unidirectional TSP(dp)

2016-06-11 11:00 369 查看
UVa 116

题解

d(i, j)
为从
(i, j)
出发到达最后一列的最小开销,

状态转移:
d(i, j) = d(min{i, (i - 1 + m) % m, (i + 1) % m}, j + 1)


初始条件:
d(i, j) = a(i, j)
, 当
j = n - 1
, 即最后一列的时候

从最后一列往前递推。

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
int inf = INT_MAX;
int a[15][105];
int d[15][105], path[15][105];
int m, n;

void exmy(){
int ans = inf, first = 0;
for(int j = n - 1; j >= 0; --j){    // 逆推,列
for(int i = 0; i < m; ++i){     // 行
if(j == n - 1) d[i][j] = a[i][j];   // 最后一列,边界
else{
int rows[3] = {i, (i - 1 + m) % m, (i + 1) % m};    //右,右上,右下
sort(rows, rows + 3);
d[i][j] = inf;
for(int k = 0; k < 3; ++k){     // 决策
int v = d[rows[k]][j + 1] + a[i][j];
if(v < d[i][j]){
d[i][j] = v;
path[i][j] = rows[k];
}
}
}
if(j == 0 && d[i][j] < ans) { ans = d[i][j]; first = i; }
}
}

printf("%d", first + 1);
for(int i = path[first][0], j = 1; j < n; i = path[i][j], j++) printf(" %d", i + 1);
printf("\n%d\n", ans);
}

int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif

while(cin >> m >> n){
for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j) scanf("%d", &a[i][j]);
}
exmy();
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  UVa dp