Vijos 1547 - 逆转,然后再见

6 篇文章 0 订阅

描述

上届的高三在这个暑假终于要到各个城市奔向他们的大学生活了。奇怪的是学校这次异
常阔气,说要用三台车子去载他们上学。上届高三的师兄们异常兴奋……可惜的是临行的时
候,学校终于露出它“狰狞”的面孔:
一、油费要学生自己给
二、去第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]);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值