典型的树形DP

按理说是先做“访问美术馆”再做偷天换日。

但是我先做了偷天换日然后再做的“访问”美术馆

DP方程好推,偷天换日在遇到有展品的时候做背包,因为是先做的偷天换日,所以把偷天换日的输入w,c直接将输入改为赋值就A了。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define MAXN 311
using namespace std;
struct node{
int to, nxt, val;
}edge[MAXN << ];
int flag, tot, n, head[MAXN], nxt[MAXN << ], to[MAXN << ], w[MAXN], val[MAXN << ], dp[MAXN][MAXN << ];
void add(int u, int v, int w) {
edge[++tot].nxt = head[u], head[u] = tot, edge[tot].to = v, edge[tot].val = w;
edge[++tot].nxt = head[v], head[v] = tot, edge[tot].to = u, edge[tot].val = w;
}
void dfs(int now) {
int t, x, flag1;
scanf("%d%d", &t, &x);
add(now, ++flag, t << );
if(!x) flag1 = flag, dfs(flag1), dfs(flag1);
else for(int i = , c, w; i <= x; i++) {
scanf("%d%d", &w, &c);
// w = 1, c = 5;
for(int j = n; j >= c; j--) dp[flag][j] = max(dp[flag][j], dp[flag][j - c] + w);
}
}
void dfs1(int now, int fa) {
for(int i = head[now]; i; i = edge[i].nxt)
if(fa != edge[i].to) {
dfs1(edge[i].to, now);
for(int j = n; j >= ; j--)
for(int k = edge[i].val; k <= j; k++)
dp[now][j] = max(dp[now][j], dp[now][j - k] + dp[edge[i].to][k - edge[i].val]);
}
}
int main() {
scanf("%d", &n), n--;
dfs(++flag);
dfs1(, );
printf("%d", dp[][n]);
return ;
}

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define MAXN 311
using namespace std;
struct node{
int to, nxt, val;
}edge[MAXN << ];
int flag, tot, n, head[MAXN], nxt[MAXN << ], to[MAXN << ], w[MAXN], val[MAXN << ], dp[MAXN][MAXN << ];
void add(int u, int v, int w) {
edge[++tot].nxt = head[u], head[u] = tot, edge[tot].to = v, edge[tot].val = w;
edge[++tot].nxt = head[v], head[v] = tot, edge[tot].to = u, edge[tot].val = w;
}
void dfs(int now) {
int t, x, flag1;
scanf("%d%d", &t, &x);
add(now, ++flag, t << );
if(!x) flag1 = flag, dfs(flag1), dfs(flag1);
else for(int i = , c, w; i <= x; i++) {
// scanf("%d%d", &w, &c);
w = , c = ;
for(int j = n; j >= c; j--) dp[flag][j] = max(dp[flag][j], dp[flag][j - c] + w);
}
}
void dfs1(int now, int fa) {
for(int i = head[now]; i; i = edge[i].nxt)
if(fa != edge[i].to) {
dfs1(edge[i].to, now);
for(int j = n; j >= ; j--)
for(int k = edge[i].val; k <= j; k++)
dp[now][j] = max(dp[now][j], dp[now][j - k] + dp[edge[i].to][k - edge[i].val]);
}
}
int main() {
scanf("%d", &n), n--;
dfs(++flag);
dfs1(, );
printf("%d", dp[][n]);
return ;
}

一世安宁

洛谷 偷天换日&&“访问”美术馆的更多相关文章

  1. 洛谷 P1270 “访问”美术馆 解题报告

    P1270 "访问"美术馆 题目描述 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向 ...

  2. 洛谷 P1270 “访问”美术馆

    P1270 “访问”美术馆 题目描述 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室.Peer ...

  3. 洛谷 P1270 “访问”美术馆(树形DP)

    P1270 “访问”美术馆 题目描述 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室.Peer ...

  4. 洛谷P1270 访问美术馆

    题目 树形DP,首先考虑递归建图,类似于线段树的中序遍历.然后取状态dp[i][j]表示i点花费j时间所偷到的最多的画,有方程: \(dp[now][nwt] = max(dp[now][nwt], ...

  5. luogu 访问”美术馆“ && 偷天换日

    把这两个题放在一起,是因为这两个题差不多,难度递进其实是懒得写两个博客所以一起分享一下 访问“美术馆” 题目描述 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个 ...

  6. 洛谷P1519 穿越栅栏 Overfencing

    P1519 穿越栅栏 Overfencing 69通过 275提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 USACO是100分,洛谷是20分 为什么 ...

  7. 洛谷P1198 [JSOI2008]最大数

    P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...

  8. 洛谷P2444 [POI2000]病毒(AC自动机,DFS求环)

    洛谷题目传送门 AC自动机入门--yyb巨佬的博客 AC自动机入手经典好题(虽然年代久远) 有了fail指针,trie树就不是原来的树型结构了,我们可以把它叫做trie图,由父节点向子节点连的边和fa ...

  9. 洛谷P2617 Dynamic Ranking(主席树,树套树,树状数组)

    洛谷题目传送门 YCB巨佬对此题有详细的讲解.%YCB%请点这里 思路分析 不能套用静态主席树的方法了.因为的\(N\)个线段树相互纠缠,一旦改了一个点,整个主席树统统都要改一遍...... 话说我真 ...

随机推荐

  1. 小程序block总结

    小程序block总结 1.block并不是一个组件,它仅仅是一个包装元素,不会在页面中做任何渲染,只接受控制属性. 2.因为 wx:if 是一个控制属性,需要将它添加到一个标签上.如果要一次性判断多个 ...

  2. BZOJ3511: 土地划分(最小割)

    Description Y国有N座城市,并且有M条双向公路将这些城市连接起来,并且任意两个城市至少有一条路径可以互达. Y国的国王去世之后,他的两个儿子A和B都想成为新的国王,但他们都想让这个国家更加 ...

  3. CTF编程题-三羊献瑞(实验吧)解题随记

    题目如下.解题步骤参考的是https://cloud.tencent.com/developer/news/373865中作者的思路. 1.首先,两个四位数相加等于一个五位数,那么这个五位数的第一位必 ...

  4. 【2017 Multi-University Training Contest - Team 4】Time To Get Up

    [Link]: [Description] [Solution] 把每个数字长什么样存到数组里就好;傻逼题. (直接输入每一行是什么样子更快,不要一个字符一个字符地输入) [NumberOf WA] ...

  5. [置顶] Docker学习总结(2)——Docker实战之入门以及Dockerfile(二)

    csphere/php-fpm:5.4 # cd docker-training/php-fpm/ # ls Dockerfile nginx_nginx.conf supervisor_nginx. ...

  6. Modbus设备调试工具Winform(包括SRC0001、海康威视、TTS以及各种类型LED的测试)

    1.SRC寄存器读写测试 2.采集数据终端模块(这里是康海时代)调试 3.RS485传感器设备调试 4.LED/TTS/海康威视等展示设备调试 5.Modbus等协议规约资料及4-20mA设备调试 以 ...

  7. Funui-Theme 资源的替换

    实现资源的替换,需要分为以下几个步骤 1.找到需要更改的模块 mediatek/packages/apps/FileManager 2.到主题模块下根据包名找到相应资源(以Grass为例) cd ve ...

  8. Android广告轮播图实现

    先看效果 第一步,布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmln ...

  9. BZOJ4025: 二分图(LCT)

    Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. Input ...

  10. 初识ThreadLocal

    近期公司在进行Java开发者的招聘活动,当中有一道面试题是这种:"请简单描写叙述一下ThreadLocal类的作用." 结果发现有非常多的面试者没有听说过ThreadLocal或者 ...