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 }
  • 相关阅读:
    36_Cache Aside Pattern缓存+数据库读写模式的分析
    35_亿级流量商品详情页的多级缓存架构以及架构中每一层的意义
    34_redis阶段性总结:1T以上海量数据+10万以上QPS高并发+99.99%高可用
    33_redis在实践中的一些常见问题以及优化思路(包含linux内核参数优化)
    正则表达式全部符号解释
    如何正确学习JavaScript
    2015阿里校招前端笔试题
    前端面试总结2
    前端面试总结
    通俗易懂的来讲讲DOM
  • 原文地址:https://www.cnblogs.com/zhexipinnong/p/2433914.html
Copyright © 2011-2022 走看看