首页 > 其他分享 >[dp记录]P3354 Riv

[dp记录]P3354 Riv

时间:2022-12-15 14:36:57浏览次数:34  
标签:P3354 head ff Riv 木头 int cnt1 dp

看到有人求多维 dp 妙题就想起此题,于是干脆来记录一下。

神仙 dp,首先看着就很树上背包,但是,部分木头可能从当前节点继续下流,最关键的是:我们还无法确认它们有多少。所以两维显然不够,第三维就需要维护这个信息或能与表达这个信息的其它东西。

一个点存储的木头最大可达 \(10^9\),把剩余木头数存到第三维看来是不可能了。那么,让我们想想,为什么需要知道剩多少木头呢?

因为这些木头还要往下漂流。

那怎么用别的信息简化呢?

直接记录它要漂流到哪里嘛!

于是就知道该怎么 dp 了。

#include <cstdio>  
#include <iostream>  
using namespace std;  
const int M = 105;  
//根 最近的伐木场编号 u与其子树共建伐木场数 f:不一定选   
int f[M][M][M], g[M][M][M], n, k, w[M], v, d;  
struct edge{  
    int to, nxt, w;  
}e[M];  
int head[M], cnt1, fa[M], s, dep[M];  
void link(int u, int v, int w){  
    e[++cnt1].to = v; e[cnt1].w =  w;  
    e[cnt1].nxt = head[u]; head[u] = cnt1;  
}  
void dfs(int u, int d){  
    fa[++s] = u; dep[u] = d;  
    for(int i = head[u]; i; i = e[i].nxt){  
        int v = e[i].to; dfs(v, d + e[i].w);  
        for(int t = 1; t <= s; t++){  
            int ff = fa[t];  
            for(int j = k; j >= 0; j--){  
                f[u][ff][j] += f[v][ff][0];  
                g[u][ff][j] += f[v][u][0];  
                for(int x = 1; x <= j; x++){  
                    f[u][ff][j] = min(f[u][ff][j], f[u][ff][j - x] + f[v][ff][x]);  
                    g[u][ff][j] = min(g[u][ff][j], g[u][ff][j - x] + f[v][u][x]);  
                }     
            }  
        }  
    }  
    //先不管在自己这里建的那个  
    //现在开始处理不一定在自己处建  
    for(int i = 1; i <= s; i++){  
        int ff = fa[i];  
        f[u][ff][0] += w[u] * (dep[u] - dep[ff]);  
        for(int j = 1; j <= k; j++){  
            f[u][ff][j] = min(g[u][ff][j - 1], f[u][ff][j] + w[u] * (dep[u] - dep[ff]));  
        }  
    } s--;  
}  
int main(){  
    scanf("%d %d", &n, &k);  
    for(int i = 1; i <= n; i++){  
        scanf("%d %d %d", &w[i], &v, &d);  
        link(v, i, d);  
    }  
    dfs(0, 0); printf("%d\n", f[0][0][k]);  
}  


分类:记录

标签:P3354,head,ff,Riv,木头,int,cnt1,dp
From: https://www.cnblogs.com/purplevine/p/16984947.html

相关文章

  • 强化学习调参技巧二:DDPG、TD3、SAC算法为例:
    1.训练环境如何正确编写强化学习里的env.reset()env.step()就是训练环境。其编写流程如下:1.1初始阶段:先写一个简化版的训练环境。把任务难度降到最低,确保一定能正常......
  • linux ethernet driver
    Referencehttps://www.cnblogs.com/YYFaGe/p/16289035.htmlhttps://www.kernel.org/doc/html/latest/driver-api/phy/phy.htmlhttps://simpleiot.blog.csdn.net/art......
  • rt_raster_to_gdal: Could not load the output GDAL driver
    问题记录:postgis安装后不能执行以下语句,查询入库的tif文件SELECTST_AsGDALRaster(rast,'GTiff')AsrastjpgFROMradar_data_xxWHERErid=1;解决办法:1. 确认......
  • wordpress---wp_query的使用方法
    wp_query是一个wordpress用于复杂请求的的一个类,看到query懂开发的人就会反应这个是数据库查询的一个类,这个类可谓是非常有用的,可以帮助我们做很多复杂的查询。wp_query的......
  • DDD Domain-Driven Design
    商品中心答疑​​http://www.nmalls.com/public/help.htm​​阿里高级技术专家方法论:如何写复杂业务代码?​​https://mp.weixin.qq.com/s/pdjlf9I73sXDr30t-5KewA​​以商品......
  • ls /sys/bus/usb/drivers
    TheexistenceoftheUSBdrivercanbecheckedfromthecontentofthedirectory/sys/bus/usb/drivers.Forexample:carl@carl-OptiPlex-7010:~$ls/sys/bus/usb/......
  • dremio CommandPool简单说明
    CommandPool实际上是一个线程池的处理,官方实现了好几种线程池主要作用限制并行请求以以及job的运行定义优先级任务特点任务基于优先级以及提交时间进行自然排序......
  • docer cgroupdriver systemd journalctl -xu kubelet
    {"exec-opts":["native.cgroupdriver=systemd"],"registry-mirrors":["https://sk4yuue7.mirror.aliyuncs.co......
  • Python用telnet设置,抓UDP抓采样点并显示
    ====main.bat====echooffrem"d:\Program\WiresharkPortable64\App\Wireshark\tshark.exe"--list-interfacesrem"d:\Program\WiresharkPortable64\App\Wireshark\tsha......
  • DP 杂题选做
    概率期望DP学习笔记树形DP学习笔记其余就不具体分类了。P1220关路灯题解说这是区间DP经典题,但我以前居然没听说过,这下尴尬了。设\(f_{i,j,0/1}\)表示关掉区......