RQNOJ 188 购物问题:树形dp
题目链接:https://www.rqnoj.cn/problem/188
题意:
商场以超低价格出售n个商品,购买第i个商品所节省的金额为w[i]。
为了防止亏本,有m对商品是不能同时买的。但保证商品关系不出现环,不会出现如:(1,2) , (2,4) , (1,4)。
问你最多能节省的金额。
题解:
简直和POJ 2342 Anniversary party像极了(*/ω\*)
将不能同时买的商品间连一条无向边。
所以子节点和父节点不能同时选。
唯一不同的是POJ是一棵树,而这道题是一片森林。需要对于每一棵树分别求dp,然后求和。
表示状态:
dp[i][j] = max discount
i:考虑到第i个商品(节点i)
j:是否选节点i (j == 0 / 1)
找到答案:
ans = ∑ max(dp[root[i]][0],dp[root[i]][1]) (root[i]为每棵树的根)
如何转移:
dp[i][1] = sigma dp[son][0] (选父节点)
dp[i][0] = sigma max dp[son][0/1] (不选父节点)
在dfs中:
dp[now][1] = w[i]
dfs(nex...)
dp[par][1] += dp[now][0]
dp[par][0] += max(dp[now][0], dp[now][1])
边界条件:
dp[i][1] = w[i] (至少选自己)
dp[i][0] = 0
AC Code:
// state expression:
// dp[i][j] = max discount
// i: considering ver i
// j: whether to select j ver
//
// find the answer:
// max dp[root][0/1]
//
// transferring:
// dp[i][1] = sigma dp[son][0]
// dp[i][0] = sigma max dp[son][0/1]
// dfs:
// dp[now][1] = w[i]
// dfs(nex...)
// dp[par[now]][1] += dp[now][0]
// dp[par[now]][0] += max(dp[now][0], dp[now][1])
//
// boundary:
// dp[i][1] = w[i]
// dp[i][0] = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAX_N 1005 using namespace std; int n,m;
int a,b;
int ans;
int w[MAX_N];
int dp[MAX_N][];
bool vis[MAX_N];
vector<int> edge[MAX_N]; void read()
{
cin>>n>>m;
for(int i=;i<=n;i++)
{
cin>>w[i];
}
for(int i=;i<m;i++)
{
cin>>a>>b;
edge[a].push_back(b);
edge[b].push_back(a);
}
} void dfs(int now,int par)
{
vis[now]=true;
dp[now][]=w[now];
for(int i=;i<edge[now].size();i++)
{
int temp=edge[now][i];
if(temp!=par) dfs(temp,now);
}
if(par!=-)
{
dp[par][]+=dp[now][];
dp[par][]+=max(dp[now][],dp[now][]);
}
} void solve()
{
memset(dp,,sizeof(dp));
memset(vis,false,sizeof(vis));
ans=;
for(int i=;i<=n;i++)
{
if(!vis[i])
{
dfs(i,-);
ans+=max(dp[i][],dp[i][]);
}
}
} void print()
{
cout<<ans<<endl;
} int main()
{
read();
solve();
print();
}
RQNOJ 188 购物问题:树形dp的更多相关文章
- vijos 1313 金明的预算方案 树形DP
描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今天一 ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- POJ2342 树形dp
原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...
- hdu1561 The more, The Better (树形dp+背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...
随机推荐
- java thin方式连接oracle数据库
本文主要描述通过thin方式连接oracle数据库 1.创建web project ,将D:\oracle\product\10.2.0\db_1\jdbc\lib(oracle安装目录)下的ojdb ...
- Nginx配置文档具体解释
Nginx的配置文档具体解释.在这儿做个总结,以便以后使用的时间查看. 下面大部分自己整理.部分来自參考 #设置用户 #user nobody; #启动进程数(一般和server的CPU同样) #能 ...
- InnoDB Insert(插入)操作(下)--mysql技术内幕
接上一篇文章,最后做的那个实验,我是想证明mysql innodb存储引擎,commit操作与flush数据到磁盘之间的关系,当与同事交流之后,他说,你应该把innodb_buffer_size的大小 ...
- tyvj-1460 旅行
题目描写叙述: A国有n座城市,每座城市都十分美,这使得A国的民众们很喜欢旅行. 然而,A国的交通十分落后,这里仅仅有m条双向的道路.而且这些道路都十分崎岖,有的甚至还是山路.仅仅能靠步行.通过每条道 ...
- RFS+AutoItLibrary测试Web对话框
Selenium2library在我们实际测试web页面的时候基本上已经够用了,不过还是会有部分情况下会脱离Selenium2library的控制,无法进行操作.比如说下载文件的时候,要选择保存文件在 ...
- java Map 实现类的对比
java为数据结构中的映射定义了一个接口 java.util.Map ,他有四个实现类
- iOS开发系列--让你的应用“动”起来【转载】
概览 原文链接:http://www.cnblogs.com/kenshincui/p/3972100.html 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥i ...
- nyist oj 37 回文字符串 (动态规划经典)
回文字符串 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描写叙述 所谓回文字符串,就是一个字符串.从左到右读和从右到左读是全然一样的.比方"aba".当 ...
- windows下如何快速优雅的使用python的科学计算库?
Python是一种强大的编程语言,其提供了很多用于科学计算的模块,常见的包括numpy.scipy.pandas和matplotlib.要利用Python进行科学计算,就需要一一安装所需的模块,而这些 ...
- spark on yarn 配置history server
spark在yarn模式下配置history server 1.建立hdfs文件– hadoop fs -mkdir /user/spark– hadoop fs -mkdir /user/spark ...