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; }
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android dpi,dip,dp的概念以及屏幕适配
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes