题目描述:
上届的高三在这个暑假终于要到各个城市奔向他们的大学生活了。奇怪的是学校这次异 常阔气,说要用三台车子去载他们上学。上届高三的师兄们异常兴奋……可惜的是临行的时 候,学校终于露出它“狰狞”的面孔: 一、油费要学生自己给 二、去第k 个城市的条件是,前k-1 个城市都要被去过 三、同时只能有一部车子在动 师兄们也只能不断地锤胸口…… 但是改乘飞机已经来不及了…… 他们只好利用电脑组的优势去编一个最短路径以减少自己付的油费。
(P.S.没有人喜欢走回头路……)
输入:
第一行一个数N,代表一共要去多少个城市。
下面N-1 行,对于第 i 行,有 n-i 个数,表示第 i 个城市分别和第i+1, i+2, i+3, ……, N 的距离
输出:
一行,最短的路程
样例输入:
5
1 1 1 2
33 33 33
33 33
33
样例输出:
36
程序代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define INF 0x3f3f3f
#define N 101
using namespace std;
int n,ans,f[N][N];
void dfs(int city,int a,int b,int c,int dis)
{
if(dis>ans)//大于最短路程直接返回
return ;
if(city==n)//城市数量等于n
{
ans=min(ans,dis);//取最小路程
return ;
}
dfs(city+1,city+1,b,c,dis+f[a][city+1]);//城市数量依次加一,第一个为城市a,接着为城市b,最后是城市c
dfs(city+1,a,city+1,c,dis+f[b][city+1]);
dfs(city+1,a,b,city+1,dis+f[c][city+1]);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++)
f[i][j]=INF;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
scanf("%d",&f[i][j]);
ans=INF;
dfs(1,1,1,1,0);
printf("%d\n",ans);
return 0;
}