HDU 5815 - Golden Week
题意:
王国地图为 n 个节点的根树,首都为 1,
m 个旅行家要去不同的终点旅游,他们分别有各自的预算,如果路上总费用超过预算就不去了
给每条路定价, 让赚的钱最多
分析:
DP[i][j]表示当从首都到城市i的路径花费为j时,以i为根的子树中的点作为目的城市的旅行者的最大花费.
只需要考虑j值等于0或等于某位旅行者预算的情况,所以dp的状态数是O(NM)的.
状态转移方程式:
DP[i][j] = j* n(i,j) + ∑max(DP[k][ji]) (ji >= j)
( n(i,j)为以i作为目标城市且预算不小于j的旅行者数量,
k 为 i 的所有子代节点
max(DP[k][ji]) 为节点k的所有ji >= j 的 DP[k][ji] 的最大值 )
上式max(DP[k, ji]) (ji >= j) 可用 DP[i][j] = max(DP[i][j], DP[i][j+1]) 递推而得
则转移方程式为:
DP[i][j] = j* n(i,j) + DP[i][j].
确定完每一点的最大花费总和后,两点的最大花费总和相减即为该边的定价
注意起点的花费一定为 0 !
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define LL long long
const int MAXN = ;
int t, n, m, s;
vector<int> mp[MAXN], id[MAXN];
LL dp[MAXN][MAXN];
LL v[MAXN];
int edge[MAXN][MAXN];
int bst[MAXN][MAXN];
LL ans[MAXN];
LL a[MAXN];
void DFS(int x,int fa)
{
for (int i = ; i < mp[x].size(); i++)
{
if (mp[x][i] != fa) DFS(mp[x][i], x);
}
for (int j = s-; j >= ; j--)
{
int t = ;
for (int i = ; i < id[x].size(); i++)
if (a[id[x][i]] >= v[j]) t++;
dp[x][j] += t*v[j]; //j* n(i,j)
for (int i = ; i < mp[x].size(); i++)
{
if (mp[x][i] == fa) continue;
int p = mp[x][i];
dp[x][j] += dp[p][j];
}
if (j == s- || dp[x][j+] <= dp[x][j])
{
bst[x][j] = j;
}
else
{
dp[x][j] = dp[x][j+];
bst[x][j] = bst[x][j+];
}
}
}
void DFS2(int x,int a,int fa)
{
for (int i = ; i < mp[x].size(); i++)
{
int e = mp[x][i];
if (e == fa) continue;
int b = bst[e][a];
ans[edge[x][e]] =v[b]- v[a];
DFS2(e,b,x);
}
}
int main()
{
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) mp[i].clear(), id[i].clear();
memset(dp,,sizeof(dp));
for (int i = ; i < n ;i++)
{
int u,v; scanf("%d%d", &u, &v);
mp[u].push_back(v);
mp[v].push_back(u);
edge[u][v] = edge[v][u] = i;
}
for (int i = ; i <= m; i++)
{
int u; scanf("%d%lld",&u, &a[i]);
v[i] = a[i];
id[u].push_back(i);
}
id[].clear();//起始点不计费!
v[] = ;
sort(v,v++m);
s = unique(v,v++m) - v;
DFS(,-);
DFS2(,,-);
printf("%lld\n",dp[][]);
for (int i = ; i < n-; i++)
printf("%lld ",ans[i]);
printf("%lld\n", ans[n-]);
}
}
HDU 5815 - Golden Week的更多相关文章
- HDU 3820 Golden Eggs (SAP | Dinic)
Golden Eggs Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 4814 Golden Radio Base 小模拟
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 题意:黄金比例切割点是,如今要求把一个10进制的的数转化成一个phi进制的数,而且不能出现'11'的 ...
- HDU 4814 Golden Radio Base 模拟
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 题目大意: 把一个正整数表示为φ进制, φ = (1+√5)/2 . 且已知: 1. φ + 1 ...
- HDU 4818 Golden Radio Base (2013长春现场赛B题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 进制转换. 现场根据题目给的两个公式,不断更新!!! 胡搞就可以了. 现场3A,我艹,一次循环开 ...
- HDU 3820 Golden Eggs
http://acm.hdu.edu.cn/showproblem.php?pid=3820 题意:n*m的格子,每个格子放金蛋或银蛋,每个格子的金蛋和银蛋都有一个对应的点权,如果有两个金蛋相连,则需 ...
- HDU 3820 Golden Eggs( 最小割 奇特建图)经典
Golden Eggs Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu 4814 Golden Radio Base
详解见:http://blog.csdn.net/tri_integral/article/details/18666797 #include<cstdio> #include<cs ...
- Todo List
Contest 11.13 2016ACM/ICPC亚洲区青岛站(5/13, solved 7/13) Training 11.06 2016年中国大学生程序设计竞赛(合肥)(solved 6/10) ...
- Golden Eggs HDU - 3820(最小割)
Golden Eggs Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- Oracle11g R2学习系列 之三教程选择
工欲善其事必先利其器,选择一本入门教程也是很重要的,本人使用的也是这位同事推荐的电子工业出版社的<<Oracle 实用教程(第3版)>>郑阿奇主编,可以至这里购买到,我个人还是 ...
- 使用div+iframe实现弹窗及弹出内容无法显示的解决
使用div+iframe实现弹窗 除了使用实际的弹出窗口,还可以使用控制一个div的display属性来模拟一个弹出窗口的操作,这里使用在Div里放一个iFrame的方式,主要考虑到可以在需要的时候加 ...
- VisualStudio中的编辑后期生成事件
在visual studio中加入项目文件,也就是引用外部文件,比如在tools\options中的show directions for中选择include files,我们需要引用项目(solut ...
- 【ROC曲线】关于ROC曲线、PR曲线对于不平衡样本的不敏感性分析说引发的思考
ROC曲线 在网上有很多地方都有说ROC曲线对于正负样本比例不敏感,即正负样本比例的变化不会改变ROC曲线.但是对于PR曲线就不一样了.PR曲线会随着正负样本比例的变化而变化.但是没有一个有十分具体和 ...
- 【转】使用adb命令对手机进行截屏(截图)保存到电脑,SDCard
原文网址:http://blog.csdn.net/huangyabin001/article/details/29198367 adb shell /system/bin/screencap -p ...
- windows phone中三种解析XML的方法
需求如下, 项目需要将一段xml字符串中的信息提取出来 <?xml version=""1.0"" encoding=""UTF-8& ...
- seajs教程之seajs学习笔记 seajs.use用法
seajs.use 用来在页面中加载模块.通过 use 方法,可以在页面中加载任意模块. 实例地址:http://www.android100.org/html/201405/23/12807.htm ...
- postGreSQL数据库部署及简单使用
1,deployByRuiyIns rpm -ivh http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.no ...
- Python与MySQL首次交互
前两天在工作之余研究了一下Python,对基础有了大致了解,就想拿她很MqSQL交互一下. 一开始就遇到了问题,要import MySQLdb,search发现有人说安装mysql-python,于是 ...
- (转)25个增强iOS应用程序性能的提示和技巧--初级篇
在开发iOS应用程序时,让程序具有良好的性能是非常关键的.这也是用户所期望的,如果你的程序运行迟钝或缓慢,会招致用户的差评.然而由于iOS设备的局限性,有时候要想获得良好的性能,是很困难的.在开发过程 ...