CSP-J冲刺 P1359 租用游艇

题目弹射机:租用游艇 - 洛谷

看完题后,你可以很快对输入进行判断:定义a[i][j]为从i->j的租金

然后就是激(suǒ)动(rán)人(wú)心(wèi)的推导转移方程的环节。

第一步:画1->3图

定义f[i]代表从i->n的最少租金

推出f[2]=a[2][3] ,f[1]=min(a[1][2]+a[2][3],a[1][3])

现在我们还是不知道方程是啥(除了某些大牛)

于是我们再次画一张1->4的图

发现:

f[3]=a[3][4]

f[2]=min(a[2][3]+a[3][4](这是f[3]),a[2][4]) 

f[1]=min(a[1][4],min(a[1][2]+min(a[2][3]+a[3][4](这是f[3]),a[2][4])(这是f[2]),a[1][3]+a[3][4](这是f3)))

看到这里……

恭喜你,已经可以编出程序了。

AC code: 

#include <bits/stdc++.h> // 万能头文件
using namespace std;
int n, a[205][205], f[205];
// a存储i->j的租用租金
// f存储从i->n的最少使用租金
int main()
{
    scanf("%d", &n);
    for (int i = 1; i < n; i++) // 循环到n-1因为一共有n个租用站,而第n个租用站没有下游的租用站
        for (int j = i + 1; j <= n; j++) // 输入从i+1到n的所有下游租用站的价格
            scanf("%d", &a[i][j]);
    memset(f, 0x3f, sizeof(f)); // 因为初始时,无法确定f[i]的值,所以都设为0x3f
    f[n] = 0; // 从n->n不需要花费任何钱财
    for (int i = n - 1; i >= 1; i--) // 从最下游开始枚举每一个点
        for (int j = i + 1; j <= n; j++) // 枚举所有能到达的点
            f[i] = min(f[i], a[i][j] + f[j]);
    printf("%d", f[1]);
    return 0;
}

给个赞再走吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值