描述
上届的高三在这个暑假终于要到各个城市奔向他们的大学生活了。奇怪的是学校这次异
常阔气,说要用三台车子去载他们上学。上届高三的师兄们异常兴奋……可惜的是临行的时
候,学校终于露出它“狰狞”的面孔:
一、油费要学生自己给
二、去第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
限制
每个数据 1s
提示
N<=100
虽然分类在记忆化搜索里面,但是感觉像是一般的深搜,而且暴力,找到一条最短的道路即可。
代码:
#include <cstdio>
int city[105][105];
int n;
int ans;
inline int minn(int a, int b)
{
return a < b ? a : b;
}
void DFS(int cur, int car1, int car2, int car3, int dis);
int main()
{
scanf("%d", &n);
for (int i = 0; i <= 100; ++i)
for (int j = 0; j <= 100; ++j)
city[i][j] = (1 << 31) - 1;
for (int i = 1; i <= n-1; ++i)
{
for (int j = i+1; j <= n; ++j)
{
int num;
scanf("%d", &num);
city[i][j] = num;
}
}
ans = (1 << 31) - 1;
DFS(1, 1, 1, 1, 0);
printf("%d\n", ans);
return 0;
}
void DFS(int cur, int car1, int car2, int car3, int dis)
{
if (cur == n)
{
ans = minn(ans, dis);
return;
}
DFS(cur + 1, cur + 1, car2, car3, dis + city[car1][cur+1]);
DFS(cur + 1, car1, cur + 1, car3, dis + city[car2][cur+1]);
DFS(cur + 1, car1, car2, cur + 1, dis + city[car3][cur+1]);
}