UVA 116 - Unidirectional TSP
2012-03-13 00:00
465 查看
写的麻烦了,修改了好久,用递归写的思路不是很好,以后要优化一下,用递推再做一遍。
代码是下:
代码是下:
#include<stdio.h> #include<string.h> #define INF 0x7fffffff int a[15][110], py[110][110][110],ans[110][110]; int m, n; int dp(int p, int q, int x) { if(ans[p][q] != 16843009) return ans[p][q]; if(q == n) return a[p][q]; else if(p>=1&&p<=m&&q>=1&&q<n) { int t = p + 1; int s = p - 1; if(t > m) t = 1; if(s < 1) s = m; // printf("p=%d q=%d ans = %d\n",p,q,ans); if(dp(s,q+1,x) > dp(p,q+1,x)) { if(dp(p,q+1,x) > dp(t,q+1,x)) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;} else if(dp(p,q+1,x) < dp(t,q+1,x)) {ans[p][q] = dp(p,q+1,x) + a[p][q];py[x][p][q] = p;} else if(p > t) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;} else {ans[p][q] = dp(p,q+1,x) + a[p][q];py[x][p][q] = p;} } else if(dp(s,q+1,x) < dp(p,q+1,x)) { if(dp(s,q+1,x) > dp(t,q+1,x)) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;} else if(dp(s,q+1,x) < dp(t,q+1,x)) {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;} else if(s > t) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;} else {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;} } else if(dp(p,q+1,x) > dp(t,q+1,x)) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;} else if(dp(p,q+1,x) < dp(t,q+1,x)) { if(s > p) {ans[p][q] = dp(p,q+1,x) + a[p][q];py[x][p][q] = p;} else {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;} } else if(dp(p,q+1,x) == dp(t,q+1,x)) { if(s>p) { if(p>t) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;} else {ans[p][q] = dp(p,q+1,x) + a[p][q];py[x][p][q] = p;} } else if(s<p) { if(t<s) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;} else {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;} } else if(s>t) {ans[p][q] = dp(t,q+1,x) + a[p][q];py[x][p][q] = t;} else {ans[p][q] = dp(s,q+1,x) + a[p][q];py[x][p][q] = s;} } return ans[p][q]; } } void print(int p ,int x, int y) { for(; y<=n; y++) { if(y == n) {printf("%d\n",x); break;} printf("%d ",x); x = py[p][x][y]; } } void input() { 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]); int v = INF; int flag; for(int i = 1; i <= m; i ++) { memset(ans,1,sizeof(ans)); int z = dp(i,1,i); if(v > z) {v = z; flag = i;} // printf("v = %d flag=%d\n",v,flag); } print( flag, flag, 1); printf("%d\n", v); } } int main() { //freopen("da.out","w",stdout); input(); return 0; }
相关文章推荐
- 单向TSP(unidirectional TSP,UVa 116)
- UVA116 Unidirectional TSP
- uva 116 - Unidirectional TSP
- UVa 116 Unidirectional TSP
- UVa116 Unidirectional TSP
- UVA 116 Unidirectional TSP
- uva 116 Unidirectional TSP
- UVA 116 Unidirectional TSP DP
- Uva 116 Unidirectional TSP
- Uva 116 - Unidirectional TSP
- Uva - 116 - Unidirectional TSP
- uva116 unidirectional TSP
- UVa116 - Unidirectional TSP
- UVa 116 - Unidirectional TSP
- uva 116 Unidirectional TSP dp + 打印路径
- UVa 116 - Unidirectional TSP
- UVa - 116 - Unidirectional TSP
- UVA - 116 Unidirectional TSP
- 例题9-4 单向TSP(Unidirectional TSP, UVa 116)
- UVa 116 - Unidirectional TSP