zoukankan      html  css  js  c++  java
  • ZOJ 1428 Magazine Delivery

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1428

    题意:有三辆车负责投递杂志,有N个位置L1, L2……LN,给出车从Li移动到Lj所用的时间D[i][j],求出投递完所有的位置所用的最少时间。

    开始时三辆车都在L1,投递时只能有一辆车移动,另外两个呆在原地。并且投递完位置Li-1才能投递Li。

     

    思路:DP

    递推公式:

    D[i][j][k][m] = min(D[i - 1][x][k][m], D[i - 1][j][x][m], D[i - 1][j][k][x]) + time[x][i]; ( 1xi )

    I代表到位置i所用的最少时间,j, k, m分别代表第一辆车,第二辆车,第三辆车的位置。

    初始条件d[1][1][1][1] = 0

    去掉两种不可达的点:车的位置大于i,以及没有一辆车的位置等于i。因为到达位置i之后必须是有一辆车的位置在i上。

    因为最前面那辆车的位置就是i,所以可以去掉一种状态。

    D[i][j][k] = min(D[i][j][k], D[i - 1][j][k] + time[i - 1][i]);             //移动第一辆车

    D[i][i - 1][k] = min(D[i][i - 1][k], D[i - 1][j][k] + time[j][i]);        //移动第二辆车

    D[i][i - 1][j] = min(D[i][i - 1][j], D[i - 1][j][k] + time[k][i]);         //移动第三辆车

     i为最前面那辆车的位置,j为次前面,k为最后。

    四状态的:

     

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 
     5 const int MAXN = 30 + 5;
     6 const int INF = 1 << 30;
     7 
     8 int n;
     9 int time[MAXN][MAXN];
    10 int dp[MAXN][MAXN][MAXN][MAXN];
    11 
    12 int min( int a, int b )
    13 {
    14     return a < b ? a : b;
    15 }
    16 
    17 int DP( int i, int j, int k, int m )
    18 {
    19     if ( i == 0 ) return 0;
    20     if ( dp[i][j][k][m] != -1 ) return dp[i][j][k][m];
    21     if ( j != i && k != i && m != i ) return dp[i][j][k][m] = INF;       //该点不可达
    22     if ( j > i || k > i || m > i ) return dp[i][j][k][m] = INF;          //该点不可达
    23 
    24     int MIN = INF;
    25 
    26     for ( int x = 1; x < i; x++ )
    27     {
    28         int temp1 = DP( i - 1, x, k, m );
    29         if ( temp1 < INF )
    30             MIN = min( MIN, temp1 + time[i][x] );
    31 
    32         int temp2 = DP( i - 1, j, x, m );
    33         if ( temp2 < INF )
    34             MIN = min( MIN, temp2 + time[i][x] );
    35 
    36         int temp3 = DP( i - 1, j, k, x );
    37         if ( temp3 < INF )
    38             MIN = min( MIN, temp3 + time[i][x] );
    39     }
    40 
    41     return dp[i][j][k][m] = MIN;
    42 }
    43 
    44 int main()
    45 {
    46     int T;
    47     scanf( "%d", &T );
    48     while ( T-- )
    49     {
    50         scanf( "%d", &n );
    51 
    52         for ( int i = 1; i < n; i++ )
    53             for ( int j = i + 1; j <= n; j++ )
    54             {
    55                 scanf( "%d", &time[i][j] );
    56                 time[j][i] = time[i][j];
    57             }
    58 
    59         memset( dp, -1, sizeof(dp) );
    60         dp[1][1][1][1] = 0;
    61 
    62         int MIN = INF;
    63 
    64         for ( int x = 1; x < n; x++ )
    65             for ( int y = 1; y < n; y++ )
    66             {
    67                 MIN = min( MIN, DP( n, n, x, y ) );
    68                 MIN = min( MIN, DP( n, x, n, y ) );
    69                 MIN = min( MIN, DP( n, x, y, n ) );
    70             }
    71 
    72         printf( "%d\n", MIN );
    73     }
    74 
    75     return 0;
    76 }

     

    三状态的:

     

     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 const int MAXN = 35;
     5 
     6 int time[MAXN][MAXN];
     7 int dp[MAXN][MAXN][MAXN];
     8 
     9 int min( int a, int b )
    10 {
    11     return a < b ? a : b;
    12 }
    13 
    14 int main()
    15 {
    16     int T;
    17     scanf( "%d", &T );
    18     while ( T-- )
    19     {
    20         int n;
    21         scanf( "%d", &n );
    22 
    23         memset( time, 0, sizeof(time) );
    24         memset( dp, 0x7f, sizeof(dp) );
    25 
    26         for ( int i = 1; i < n; i++ )
    27           for ( int j = i + 1; j <= n; j++ )
    28           {
    29               scanf( "%d", &time[i][j] );
    30               time[j][i] = time[i][j];
    31           }
    32 
    33         dp[1][1][1] = 0;
    34         for ( int i = 2; i <= n; i++ )
    35           for ( int j = 1; j < i; j++ )
    36              for ( int k = 1; k < i; k++ )
    37              {
    38                  dp[i][j][k] = min( dp[i][j][k], dp[i - 1][j][k] + time[i - 1][i] );
    39                  dp[i][i - 1][k] = min( dp[i][i - 1][k], dp[i - 1][j][k] + time[j][i] );
    40                  dp[i][i - 1][j] = min( dp[i][i - 1][j], dp[i - 1][j][k] + time[k][i] );
    41              }
    42 
    43         int MIN = 0x7fffffff;
    44         for ( int i = 1; i < n; i++ )
    45           for ( int j = 1; j < n; j++ )
    46               MIN = min( MIN, dp[n][i][j] );
    47 
    48         printf( "%d\n", MIN );
    49     }
    50     return 0;
    51 }

     

     

     

  • 相关阅读:
    代码review之 isInfoEnable()
    sdk、jdk、jre、jvm、jdt、cdt分别都是什么东西
    思考总结: 决胜21点 开篇 概率问题
    Java多线程开发系列之四:玩转多线程(线程的控制2)
    Java多线程开发系列之四:玩转多线程(线程的控制1)
    Java多线程开发系列之三:线程这一辈子(线程的生命周期)
    Java多线程开发系列之二:如何创建多线程
    [系列] Gin框架
    [系列] Gin框架
    [系列] Gin 框架
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/2622667.html
Copyright © 2011-2022 走看看