题目链接: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的更多相关文章

  1. vijos 1313 金明的预算方案 树形DP

    描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今天一 ...

  2. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  3. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  4. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  5. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  6. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  7. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  8. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

  9. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

随机推荐

  1. OpenTSDB设计解读

    OpenTSDB是基于HBase存储时间序列数据的一个开源数据库,确切地说,它仅仅是一个HBase的应用而已,其对于时间序列数据的处理能够供其它系统參考和借鉴.本文会针对它在数据库的设计方面展开一些探 ...

  2. iscroll的理解

    1. 最佳的HTML结构如下: <div id="wrapper"> <ul> <li>...</li> <li>... ...

  3. wcf上传字节数组报错问题

    为了实现上传大文件所以我们要如下设置最大值,其中security是设置访问服务的认证,此处是把它设置成为不认证,transferMode就是设置运用流的模式 <webHttpBinding> ...

  4. 面试宝典之预处理、const与sizeof

    #include <stdio.h> #define SUB(x, y) x - y #define ACCESS_BEFORE(element, offset, value) *SUB( ...

  5. spring学习六----------Bean的配置之Aware接口

    © 版权声明:本文为博主原创文章,转载请注明出处 Aware Spring提供了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化后,可以获取相应的资源 通过Aware接口,可以对S ...

  6. 你要的最后一个字符就在下面这个字符串里,这个字符是下面整个字符串中第一个只出现一次的字符。(比如,串是abaccdeff,那么正确字符就是b了)

    include "stdafx.h" #include<iostream> #include<string> using namespace std; in ...

  7. 链接脚本使用一例2---将二进制文件 如图片、MP3音乐、词典一类的东西作为目标文件中的一个段

    参考文章: <程序员的自我修养——链接.转载与库> P68 这里介绍两种方法,实现将将一张图片作为二进制可执行程序的一个段,其中第一种方法在我之前的博客中已经有所介绍,不过,那是采用的是交 ...

  8. linux下网卡绑定

    网卡绑定的作用:1.冗余,防止单点故障 2.防止传输瓶颈 1.交换机端口绑定: system-view link-aggregation group 1 mode manual 比如把端口1和2进行绑 ...

  9. 通过srvctl add命令添加database信息到srvctl管理器

    ================================================通过srvctl add命令添加database信息到srvctl管理器================ ...

  10. ASP.NET动态网站制作(4)--css(3)

    前言:这节课主要运用前面所学的知识写三个例子,并且学习浏览器兼容性的解决方法. 内容: 例子1:一个关于列表的例子 html代码: <!DOCTYPE html PUBLIC "-// ...