• UVA 116 -- Unidirectional TSP(DP)


    UVA 116 -- Unidirectional TSP 

    题意:

    求从第一列到最后一列的一个字典序最小的最短路,要求不仅输出最短路长度,还要输出字典序最小的路径。

    解题思路:

    设d(i,j)为从格子(i,j)出发,到最后一列的最小开销。因为不仅要输出解,还要输出字典序最小的序列,所以需要再计算d(i,j)的同时记录“下一列的行号”的最小值

    For each specification the number of rows will be between 1 and 10 inclusive; the number of columns will be between 1 and 100 inclusive. No path’s weight will exceed integer values representable using 30 bits.

     1 #include<iostream>
     2 #include<algorithm> 
     3 using namespace std;
     4 const int INF = 0x3f3f3f3f;
     5 const int maxi = 10+5;
     6 const int maxj = 100+5;
     7 int d[maxi][maxj];
     8 int a[maxi][maxj];
     9 int c[maxi][maxj];///记录路径 
    10 
    11 int main()
    12 {
    13     int m,n;
    14     while(cin>>m>>n){
    15         for(int i=0;i<m;i++)
    16             for(int j=0;j<n;j++)
    17                 cin>>a[i][j];
    18         int ans = INF,first = 0;
    19         for(int j=n-1;j>=0;j--){//
    20             for(int i=0;i<m;i++){
    21                 if(j == n-1){//最右边一列 
    22                     d[i][j] = a[i][j];
    23                 }
    24                 else{
    25                     int rows[3] = {i,i-1,i+1};
    26                     if(i == 0) rows[1] = m-1;//第0行“上面”是第m-1行 
    27                     if(i == m-1) rows[2] = 0;//最后一行“下面”是第0行 
    28                     sort(rows,rows+3);//重新排序,以便找到字典序最小的 
    29                     d[i][j] = INF;
    30                     for(int k = 0;k<3;k++){
    31                         int v = d[rows[k]][j+1] + a[i][j];
    32                         if(v < d[i][j]) {
    33                             d[i][j] = v;c[i][j] =  rows[k];
    34                         }
    35                     }
    36                 }
    37                 if(j == 0 && d[i][j]<ans){
    38                     ans = d[i][j];first = i;
    39                 }
    40             }
    41         }
    42         
    43         cout<<first+1;
    44         for(int i=c[first][0],j=1;j<n;i = c[i][j],j++)
    45             cout<<" "<<i+1; 
    46         cout<<endl<<ans<<endl;
    47     }
    48     
    49     return 0;
    50  } 

    测试样例:
    5 6
    3 4 1 2 8 6
    6 1 8 2 7 4
    5 9 3 9 9 5
    8 4 1 3 2 6
    3 7 2 8 6 4
    5 6
    3 4 1 2 8 6
    6 1 8 2 7 4
    5 9 3 9 9 5
    8 4 1 3 2 6
    3 7 2 1 2 3
    2 2
    9 10 
    9 10
    10 14 
    1 2 2 1 1 1 1 1 1 1 1 1 1 2 
    1 1 2 2 1 1 1 1 1 1 1 1 1 1 
    1 1 1 2 2 1 1 1 1 1 1 1 1 1 
    1 1 1 1 2 2 1 1 1 1 1 1 1 1 
    1 1 1 1 1 2 2 1 1 1 1 1 1 1 
    1 1 1 1 1 1 2 2 1 1 1 1 1 1 
    1 1 1 1 1 1 1 2 2 1 1 1 1 1 
    1 1 1 1 1 1 1 1 2 2 1 1 1 1 
    1 1 1 1 1 1 1 1 1 2 2 1 1 1 
    1 1 1 1 1 1 1 1 1 1 2 2 1 1 
    4 7
    1 2 -3 4 -2 1 5
    -1 3 5 -2 6 -3 4
    2 1 3 -2 -1 3 1
    3 -3 4 2 -3 4 3
    5 6
    3 4 1 2 8 6
    6 1 8 2 7 4
    5 9 3 9 9 5
    8 4 1 3 2 6
    3 7 2 8 6 4
    5 6
    3 4 1 2 8 6
    6 1 8 2 7 4
    5 9 3 9 9 5
    8 4 1 3 2 6
    3 7 2 1 2 3
    2 2
    9 10
    9 10
    5 6
    1 1 1 1 1 1
    2 2 2 2 2 2
    3 3 3 3 3 3
    4 4 4 4 4 4
    5 5 5 5 5 5
    3 4
    1 2 3 4
    1 2 3 4
    1 2 3 4
    5 5
    1 5 10 6 3
    5 1 8 4 11
    10 12 5 2 9
    7 3 20 5 8
    4 1 5 12 6
    5 10
    11 53 34 73 18 53 99 52 31 54
    4 72 24 6 46 17 63 82 89 25
    67 22 10 97 99 64 33 45 81 76
    24 71 46 62 18 11 54 40 17 51
    99 8 57 76 7 51 90 92 51 21
    5 10
    11 53 1 73 18 53 99 52 31 54
    4 72 54 6 46 17 63 82 89 25
    67 22 80 97 99 64 33 45 81 76
    24 71 46 62 18 11 54 40 17 51
    99 8 57 76 7 51 90 92 51 21
    5 6
    -3 -4 -1 -2 -8 -6
    -6 -1 -8 -2 -7 -4 -5 -9 -3 -9 -9 -5
    -8 -4 -1 -3 -2 -6 -3 -7 -2 -8 -6 -4
    10 100
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    4 29
    1 -1 0 0 1 -1 -1 -1 1 1 0 1 -1 -1 -1 0 -1 -1 1 -1 1 0 0 -1 0 -1 1 1 0
    -1 1 0 -1 -1 0 1 0 -1 -1 -1 -1 1 1 0 -1 -1 0 -1 -1 1 -1 1 0 -1 1 0 1 -1
    0 0 1 0 -1 1 0 0 1 1 0 -1 1 1 -1 -1 1 0 0 1 1 0 -1 1 0 -1 -1 1 1
    1 -1 -1 -1 -1 -1 0 0 0 1 -1 0 0 0 -1 -1 0 -1 0 1 0 -1 1 0 1 1 -1 0 1
    1 1
    1
    结果:
    1 2 3 4 4 5
    16
    1 2 1 5 4 5
    11
    1 1
    19
    1 2 3 4 5 6 7 8 9 10 1 1 1 2
    14
    1 4 1 2 1 2 3
    -11
    1 2 3 4 4 5
    16
    1 2 1 5 4 5
    11
    1 1
    19
    1 1 1 1 1 1
    6
    1 1 1 1
    10
    1 2 3 2 1
    14
    2 3 3 2 1 2 3 4 4 5
    188
    1 5 1 2 1 2 3 4 4 5
    172
    4 3 2 3 3 4
    -49
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    100
    2 1 4 4 3 4 1 1 2 2 2 2 1 1 1 2 1 1 2 1 4 4 1 1 2 1 4 1 2
    -25
    1
    1

  • 相关阅读:
    Python学习————正向代理和反向代理
    Python学习————drf(三)
    Python学习————drf(二)
    Python学习————drf(一)
    Python学习————python基础复习(四)
    Python学习————python基础复习(三)
    Python学习————python基础复习(二)
    Python学习————python基础复习(一)
    Python学习————Django
    51Nod1523 非回文
  • 原文地址:https://www.cnblogs.com/yxh-amysear/p/8469678.html
Copyright © 2020-2023  润新知