LibreOJ #2510.「HNOI2018」道路 树形dp

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33229466/article/details/79965026

题意

这里写图片描述
这里写图片描述

分析

在考场上的时候以为这是神仙题,就没有太仔细想,结果这就是一道普及dp题。
设f[d,x,y]表示以d为根的子树,上面有x条公路,y条铁路时的最优翻修方案。
记忆化搜索一下就好了。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>

typedef long long LL;

const int N=20005;

int n,l[N],r[N],a[N*2],b[N*2],c[N*2];
LL f[N][45][45];

LL dp(int d,int x,int y)
{
    if (d>=n) return (LL)c[d]*(a[d]+x)*(b[d]+y);
    if (f[d][x][y]) return f[d][x][y];
    f[d][x][y]=std::min(dp(l[d],x+1,y)+dp(r[d],x,y),dp(l[d],x,y)+dp(r[d],x,y+1));
    return f[d][x][y];
}

int main()
{
    scanf("%d",&n);
    for (int i=1;i<n;i++)
    {
        int s,t;scanf("%d%d",&s,&t);
        l[i]=s>0?s:n-1-s;
        r[i]=t>0?t:n-1-t;
    }
    for (int i=n;i<n*2;i++) scanf("%d%d%d",&a[i],&b[i],&c[i]);
    printf("%lld",dp(1,0,0));
    return 0;
}
阅读更多
想对作者说点什么? 我来说一句
相关热词

没有更多推荐了,返回首页