题目链接: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();
}

最新文章

  1. 学习《Hardware-Efficient Bilateral Filtering for Stereo Matching》一文笔记。
  2. Linux PXE无盘工作站
  3. android 对View的延时更换内容
  4. M站开发规范——By Klax
  5. 创建支持多种屏幕尺寸的Android应用
  6. jquery的toFixed方法的正确使用
  7. Javascript:常用函数封装
  8. 转载:HttpClient使用详解
  9. 北京联想招聘-IOS高级 加入qq 群:220486180 或者直接在此 留言咨询
  10. ORACLE RAC集群的体系结构
  11. (顺序表的应用5.4.2)POJ 1591 M*A*S*H(约瑟夫环问题的变形——变换步长值)
  12. java 集合(Set2)
  13. Apache CXF实现Web Service(4)——Tomcat容器和Spring实现JAX-RS(RESTful) web service
  14. [itint5]树中最大路径和
  15. ACM ICPC Asia Regional 2011 Kuala Lumpur C题
  16. 如何用webgl(three.js)搭建一个3D库房-第二课
  17. Css3新属性:calc()
  18. Mysql事件监控日志
  19. JS call和apply方法使用
  20. PostgreSQL——前言

热门文章

  1. {}在javascript与(python,java)中的含义区别
  2. 以其他字段作为某一字段的值. 字段长度char_length(?)
  3. 【Python】导入类
  4. ceres g2o 安装
  5. Nginx在windows2003下的使用 PHP
  6. 如何在DOS窗口中显示UTF-8字符
  7. MySQL数据表导出某条记录
  8. typedef struct与struct定义结构体
  9. LeetCode -- Flatten 二叉树
  10. 计算机网络 --万维网www