• P1547逆转,然后再见


    描述

    上届的高三在这个暑假终于要到各个城市奔向他们的大学生活了。奇怪的是学校这次异
    常阔气,说要用三台车子去载他们上学。上届高三的师兄们异常兴奋……可惜的是临行的时
    候,学校终于露出它“狰狞”的面孔:
    一、油费要学生自己给
    二、去第k 个城市的条件是,前k-1 个城市都要被去过
    三、同时只能有一部车子在动
    师兄们也只能不断地锤胸口……
    但是改乘飞机已经来不及了……
    他们只好利用电脑组的优势去编一个最短路径以减少自己付的油费。

    (P.S.没有人喜欢走回头路……)

    格式

    输入格式

    第一行一个数N,代表一共要去多少个城市。

    下面N-1 行,对于第 i 行,有 n-i 个数,表示第 i 个城市分别和第i+1, i+2, i+3, ……, N 的距离

    输出格式

    一行,最短的路程

    样例1

    样例输入1[复制]

    5
    1 1 1 2
    33 33 33
    33 33
    33

    样例输出1[复制]

    36

    限制

    每个数据 1s

    提示

    N<=100

    思路:dp

    dp[i][j][k]表示第一辆车在第i个城市,第二辆车在第j个城市,第三辆车在第k个城市的最小路径;

    初始化:f[1][1][1]=0,其余为Max
    now表示当前到达的最远的城市(即now=max(i,j,k))
    f[now+1][j][k]=min(f[now+1][j][k],f[i][j][k]+a[i][now+1])
    f[i][now+1][k]=min(f[i][now+1][k],f[i][j][k]+a[j][now+1])
    f[i][j][now+1]=min(f[i][j][now+1],f[i][j][k]+a[k][now+1])
    在所有的now=n时,记录最小值。

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<stdlib.h>
     5 #include<string.h>
     6 #include<math.h>
     7 #include<queue>
     8 using namespace std;
     9 typedef long long LL;
    10 int dp[105][105][105];
    11 int nn[200][200];
    12 const int N=1e9;
    13 int main(void)
    14 {
    15         int i,j,k;
    16         while(scanf("%d",&k)!=EOF)
    17         {
    18                 int x,y;
    19                 for(i=1; i<k; i++)
    20                 {
    21                         for(j=i+1;j<=k;j++)
    22                         {
    23                             scanf("%d",&nn[i][j]);
    24                         }
    25                 }
    26                 for(i=0; i<105; i++)
    27                 {
    28                         for(j=0; j<105; j++)
    29                         {
    30                                 for(x=0; x<105; x++)
    31                                 {
    32                                         dp[i][j][x]=N;
    33                                 }
    34                         }
    35                 }
    36                 int ans=1e9;
    37                 dp[1][1][1]=0;
    38                 for(i=1; i<k; i++)
    39                 {
    40                         for(j=1; j<k; j++)
    41                         {
    42                                 for(x=1; x<k; x++)
    43                                 {
    44                                         int xx=max(i,j);
    45                                         xx=max(x,xx);
    46                                dp[xx+1][j][x]=min(dp[xx+1][j][x],dp[i][j][x]+nn[i][xx+1]);
    47                                dp[i][xx+1][x]=min(dp[i][xx+1][x],dp[i][j][x]+nn[j][xx+1]);
    48                                dp[i][j][xx+1]=min(dp[i][j][xx+1],dp[i][j][x]+nn[x][xx+1]);
    49                                         if(xx+1==k)
    50                                         {ans=min(dp[xx+1][j][x],ans);
    51                                                 ans=min(dp[i][j][xx+1],ans);
    52                                                 ans=min(ans,dp[i][xx+1][x]);
    53                                         }
    54                                 }
    55                         }
    56                 }
    57                 printf("%d
    ",ans);
    58         }
    59         return 0;
    60 }
    油!油!you@
  • 相关阅读:
    win10下安装为知笔记的markdown插件
    最近一段时间的工作状态
    C++中的取余与取模
    来新项目后,最心虚的一个夜晚
    g++添加支持c++11的选项
    Linux ssh远程登陆方式:密码与公钥
    判断脚本加载完成
    解决ie6下最小高度问题
    display:inline-block的深入理解
    ff下button按钮上的文字垂直居中
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5489461.html
Copyright © 2020-2023  润新知