UVA 116 Unidirectional TSP

这个题吧,其实对很多人来说真的是水题,但是~~我把这个题AC掉了,真的是付出了蛮大的代价的。

虽然AC掉了,但是,这个方案肯定不是最好的,特别是保存路径,我开了三维的数组。

思路其实很简单,就是有点象枚举,状态转移方程应该是dp[i][j]=a[i][j]+min{dp[t][i+1]}(t为与i相邻的行,相邻的话稍微处理一下就可以了)

这个题目要求一定是要按字典序最小输出路径,所以说最好应该是从后往前递推的,否则麻烦就大了,我就是在这个上面吃了苦头,一开始以为无所谓的,从哪边来都可以的,后来发现问题了,就动了大手术啊,调试就太悲催了,各种BUG啊。可见,写代码之前一定要想清楚了。这道题,还是体现了我现在跟高手的差距之大大大大大大啊。

View Code
 1 #include <stdio.h>
2 #include <string.h>
3 #define MAX 0xffffff
4 int a[11][101],dp[11][101],res[11][101][101];
5 int main()
6 {
7 int row,column,i,j,k,temp,ans,t,tempa,tempb;
8 while(scanf("%d%d",&row,&column) == 2)
9 {
10 for(i = 0;i <= row;i++)
11 for(j = 0;j <= column;j++)
12 dp[i][j] = MAX;
13 memset(a,0,sizeof(a));
14 memset(res,0,sizeof(res));
15 for(i = 1;i <= row;i++)
16 for(j = 1;j <= column;j++)
17 scanf("%d",&a[i][j]);
18 for(j = 1;j <= row;j++)
19 {
20 dp[j][column] = a[j][column];
21 res[j][column][column] = j;
22 }
23 for(i = column - 1;i >= 1;i--)
24 {
25 for(j = 1;j <= row;j++)
26 {
27 temp = MAX;
28 if((dp[j][i + 1] + a[j][i] == dp[j][i] && j < temp) || (dp[j][i + 1] + a[j][i] < dp[j][i]))
29 {
30 dp[j][i] = dp[j][i + 1] + a[j][i];
31 temp = j;
32 }
33 tempa = (j - 1 == 0) ? row : j - 1;
34 if((dp[tempa][i + 1] + a[j][i] == dp[j][i] && tempa < temp) || (dp[tempa][i + 1] + a[j][i] < dp[j][i]))
35 {
36 dp[j][i] = dp[tempa][i + 1] + a[j][i];
37 temp = tempa;
38 }
39 tempb = (j + 1 > row) ? 1 : j + 1;
40 if((dp[tempb][i + 1] + a[j][i] == dp[j][i] && tempb < temp) || (dp[tempb][i + 1] + a[j][i] < dp[j][i]))
41 {
42 dp[j][i] = dp[tempb][i + 1] + a[j][i];
43 temp = tempb;
44 }
45 for(k = column;k > i;k--)
46 res[j][i][k] = res[temp][i + 1][k];
47 res[j][i][k] = j;
48 }
49 }//for i
50 /*for(i = 1;i <= row;i++)
51 {
52 for(j = 1;j <= column;j++)
53 printf("%d ",dp[i][j]);
54 putchar('\n');
55 }
56 */
57 ans = MAX;
58 for(i = 1;i <= row;i++)
59 {
60 if(dp[i][1] < ans)
61 {
62 ans = dp[i][1];
63 t = i;
64 }
65 }
66 for(i = 1;i <= column - 1;i++)
67 printf("%d ",res[t][1][i]);
68 printf("%d",res[t][1][column]);
69 putchar('\n');
70 printf("%d\n",ans);
71 }//while
72 }

 

posted @ 2012-04-05 23:14  浙西贫农  阅读(268)  评论(0编辑  收藏  举报