测试1T2

题目描述

Lyk去推塔。但是推第n座塔必须先推了第1~n-1座塔。
为了加快速度lyk召唤出了szh和txm。求lyk和他的召唤兽们为了推完所有塔所经过的最短距离。

 

输入

第一行一个数N,代表一共要去多少个城市。
下面N-1 行,对于第 i 行,有 n-i 个数,表示第 i 个城市分别和第i+1, i+2, i+3, ……, N 的距离(距离<=10000)

 

输出

一个数,表示最短距离

 

样例输入

5
1 1 1 2
33 33 33
33 33
33

样例输出

36

提示

 

Constraints

对于30%,n<=10

对于100%,n<=100

第一遍做时爆搜爆0
DP即可
f[i][j][k]表示推到第i座塔,其余两只怪兽在j,k时的最短距离

f[i+1][j][i]=min(f[i+1][j][i],f[i][j][k]+dist[k][i+1]);
f[i+1][j][k]=min(f[i+1][j][k],f[i][j][k]+dist[i][i+1]);
[i+1][i][k]=min(f[i+1][i][k],f[i][j][k]+dist[j][i+1]);

第一遍暴力floyd预处理出所有点对间的最短距离

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[105][105],dp[105][105][105],n;
void floyd()
{
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
               for(int k=j+1;k<=n;k++)
                   if(i!=k&&j!=k&&i!=j)
                   if(a[i][j]+a[j][k]<a[i][k])
                   a[i][k]=a[i][j]+a[j][k];
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n-i;j++)
                scanf("%d",&a[i][i+j]);
    floyd();
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        for(int k=1;k<=n;k++)
          dp[i][j][k]=0x7FFFFFFF; 
    dp[1][1][1]=0;
    for(int i=1;i<n;i++)
          for(int j=1;j<=i;j++)
              for(int k=1;k<=i;k++)
              if(dp[i][j][k]!=0x7FFFFFFF)
              {
                  dp[i+1][j][i]=min(dp[i+1][j][i],dp[i][j][k]+a[k][i+1]);
                  dp[i+1][j][k]=min(dp[i+1][j][k],dp[i][j][k]+a[i][i+1]);
                  dp[i+1][i][k]=min(dp[i+1][i][k],dp[i][j][k]+a[j][i+1]);
            }
    int ans=0x7FFFFFFF;        
    for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
            ans=min(ans,dp[n][i][j]);
    printf("%d\n",ans);                    
}

题意难懂~~

 
 
 
posted @ 2017-05-11 14:09  dancer16  阅读(146)  评论(0编辑  收藏  举报
描述