zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    129. Sum Root to Leaf Numbers
    117. Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/zhexipinnong/p/2433914.html
Copyright © 2011-2022 走看看