题目链接: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. /etc/shadow 密码加密方法

    [root@mysql-master ~]# cat /etc/shadowroot:$6$spzQDWctb8Lmju0o$KoUz5Qwv1tWyVYfd5cuBw.TQVIaCvCX8ixGG9 ...

  2. Hessian原理与程序设计

     Hessian是比較经常使用的binary-rpc.性能较高,适合互联网应用.主要使用在普通的webservice 方法调用.交互数据较小的场景中.hessian的数据交互基于http协议,通常he ...

  3. 转:3.3V和5V电平双向转换——NMOS管

    分简单,仅由3个电阻加一个MOS管构成,电路图如下: 此电路来自于飞利浦的一篇设计指导文档,是I2C总线官方推荐使用的电平转换电路.在实际使用过程中,需要尤其注意NMOS管的选型以及上拉电阻阻值的选取 ...

  4. Hibernate学习六----------CRUD

    © 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  5. Lua学习七----------Lua函数

    © 版权声明:本文为博主原创文章,转载请注明出处 1.Lua函数 - 完成指定的任务,这种情况下函数作为调用语句使用 - 计算并返回值,这种情况下函数作为赋值语句的表达式使用 - Lua函数可以返回多 ...

  6. 解决Linux中文环境下astro和Calibre不能输入的问题

    例如我的opensuse在中文环境下不能在astro中输入指令,Calibre的grid spacing设置框不能输入,经过摸索,找到以下两种解决方法: 1.    将系统环境变成英文,在.bashr ...

  7. 非spring托管的类使用spring脱管的类。

    import org.springframework.beans.BeansException; import org.springframework.context.ApplicationConte ...

  8. 【WPF学习笔记】之如何把数据库里的值读取出来然后显示在页面上:动画系列之(六)(评论处有学习资料及源码)

    (应博友们的需要,在文章评论处有源码链接地址,以及WPF学习资料.工具等,希望对大家有所帮助) ...... 承接系列五 上一节讲了,已经把数据保存到数据库并且删除数据,本讲是把已经存在的数据从数据库 ...

  9. 【PHP开发】远程文件(图片)下载

    这一篇文章介绍的方法不算原创了,只是引用的别人的文章,加上自己的注释,因为接触php时间不长,所以尝试的东西比较多,自己加的注释也比较简单,php高手请略过. 我要用到远程下载图片,是在做微信公众平台 ...

  10. 初学shell,今天遇到由wget下载到本地的网页源代码的乱码问题,无聊的写了一个转码的脚本

    今天用wget想下载文件,结果下载了一堆本地的index.html文件,一查看全是乱码,然后百度了一下,网页的编码格式大概有三种: 1.utf-8 2.gb2312 3.gbk 要在网页源码中的< ...