loj 2510. 「AHOI / HNOI2018」道路

本文介绍了一种使用记忆化搜索解决特定分层结构问题的方法。通过递归地求解子问题并缓存结果避免重复计算,实现了一个高效的算法。具体地,针对不超过log层的结构,该算法能有效地找到最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

这里写图片描述

题解:

这题……阅读理解题吧。
既然只有loglog层,那么f[x][a][b]f[x][a][b]记忆化搜索下就好。
code:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#define LL long long
using namespace std;
LL l[20010],r[20005];
LL f[20005][45][45],n;
LL a[40005],b[40005],c[40005];
LL dfs(LL x,LL X,LL Y)
{
    if(x>=n) return c[x]*(a[x]+X)*(b[x]+Y);
    if(f[x][X][Y]) return f[x][X][Y];
    f[x][X][Y]=min(dfs(l[x],X+1,Y)+dfs(r[x],X,Y),dfs(l[x],X,Y)+dfs(r[x],X,Y+1));
    return f[x][X][Y];
}
int main()
{
    scanf("%lld",&n);
    for(LL i=1;i<n;i++)
    {
        LL s,t;scanf("%lld %lld",&s,&t);
        l[i]=s>0?s:n-s-1;r[i]=t>0?t:n-t-1;
    }
    for(LL i=n;i<2*n;i++) scanf("%lld %lld %lld",&a[i],&b[i],&c[i]);
    printf("%lld",dfs(1,0,0));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值