警卫站岗(树上dp)

题目描述

五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序。
已知整个地下超市的所有通道呈一棵树的形状;某些通道之间可以互相望见。总经理要求所有通道的每个端点(树的顶点)都要有人全天候看守,在不同的通道端点安排保安所需的费用不同。
一个保安一旦站在某个通道的其中一个端点,那么他除了能看守住他所站的那个端点,也能看到这个通道的另一个端点,所以一个保安可能同时能看守住多个端点(树的结点),因此没有必要在每个通道的端点都安排保安。
任务:
请你帮助超市经理策划安排,在能看守全部通道端点的前提下,使得花费的经费最少。

解析

树上dp
状态定义:𝑓[𝑥][0/1/2]分别对应以下三种情况:

0.x节点被自己覆盖,即选择x点来覆盖x点
1.x节点被儿子y覆盖,即选择y点来覆盖x点
2.x节点被父亲fa覆盖,即选择fa点来覆盖x点

转移为:

𝑓[𝑥][0]=∑ min⁡(𝑓[𝑦][0],𝑓[𝑦][1],𝑓[𝑦][2]) + 𝑣𝑎𝑙[𝑥]
𝑓[𝑥][2]=∑ min⁡(𝑓[𝑦][0],𝑓[𝑦][1])
𝑓[𝑥][1]=∑ min⁡(𝑓[𝑦][0],𝑓[𝑦][1])
第三种如果选择的全部都是𝑓[𝑦][1],要再加上min⁡(𝑓[𝑦][0]−𝑓[𝑦][1])

然后就完事了

代码

#include <bits/stdc++.h>
using namespace std;
const int N=1800;
int n,m;
/*
op=0 被自己覆盖
op=1 被儿子覆盖
op=2 被父亲覆盖  
*/
struct node{int to,nxt;
}p[N];
int fi[N],cnt=-1,ru[N];
int v[N];
void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;
}
int a,b,c;
int dp[N][5];
int find(int x,int op){if(dp[x][op]) return dp[x][op];int ans=0;
//	printf("op=%d\n",op);if(op==0){ans=v[x];for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;ans+=min(find(to,0),min(find(to,1),find(to,2)));}
//		printf("%d %d %d\n",x,op,ans);return dp[x][op]=ans;}else if(op==2){for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;ans+=min(find(to,0),find(to,1));}
//		printf("%d %d %d\n",x,op,ans);return dp[x][op]=ans;}else if(op==1){int flag=1,mn=2e9;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(find(to,0)<find(to,1)) flag=0;if(flag){mn=min(mn,find(to,0)-find(to,1));}ans+=min(find(to,0),find(to,1));}if(flag) ans+=mn;
//		printf("%d %d %d\n",x,op,ans);return dp[x][op]=ans;}
}
int main(){memset(fi,-1,sizeof(fi));scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d%d",&a,&b,&c);v[a]=b;for(int j=1;j<=c;j++){scanf("%d",&b);addline(a,b);ru[b]++;}}for(int i=1;i<=n;i++){if(ru[i]==0){printf("%d",min(find(i,0),find(i,1)));break;}}return 0;
} 
/*
6
1 30 3 2 3 4
2 16 2 5 6
3 5 0
4 4 0
5 11 0
6 5 0
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core实战项目之CMS 第八章 设计篇-内容管理极简设计全过程

写在前面上一篇文章.NET Core实战项目之CMS 第七章 设计篇-用户权限极简设计全过程中我带着大家进行了权限部分的极简设计&#xff0c;也仅仅是一个基本的权限设计。不过你完全可以基于这套权限系统设计你的更复杂的权限系统&#xff0c;当然更复杂的权限系统要根据你的业务来进…

P7405-[JOI 2021 Final]雪玉【二分】

正题 题目链接:https://www.luogu.com.cn/problem/P7405 题目大意 nnn个点在坐标轴上&#xff0c;qqq次每次所有点向一个方向移动若干步&#xff0c;每个点的权值是它第一次覆盖的区间长度&#xff08;也就是一个区间只能贡献到第一次经过它的点&#xff09;。 求所有点的最终…

牛客题霸 [ 集合的所有子集] C++题解/答案

牛客题霸 [ 集合的所有子集] C题解/答案 题目描述 现在有一个没有重复元素的整数集合S&#xff0c;求S的所有子集 注意&#xff1a; 你给出的子集中的元素必须按升序排列 给出的解集中不能出现重复的元素 题解&#xff1a; 先sort一下&#xff0c;然后通过回溯实现选与不选…

2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love max and multiply(转化)

I love max and multiply Code 代码抄的std #include<bits/stdc.h> using namespace std; using lllong long; template <class Tint> T rd() {T res0;T fg1;char chgetchar();while(!isdigit(ch)) {if(ch-) fg-1;chgetchar();}while( isdigit(ch)) res(res<&…

人工智能第二课:认知服务和机器人框架探秘

这是《人工智能系列笔记》的第二篇&#xff0c;我利用周六下午完成课程学习。这一方面是因为内容属于入门级&#xff0c;并且之前我已经对认知服务和机器人框架比较熟悉。如有兴趣&#xff0c;请关注该系列 https://aka.ms/learningAI 但是学习这门课程还是很有收获&#xff0c…

洛谷P4322 最佳团伙(树上dp)

题目描述 洛谷传送门 题目描述 JSOI 信息学代表队一共有 N 名候选人&#xff0c;这些候选人从 1 到 N 编号。方便起见&#xff0c;JYY 的编号是 0 号。每个候选人都由一位编号比他小的候选人Ri推荐。如果 Ri0&#xff0c;则说明这个候选人是 JYY 自己看上的。 为了保证团队的…

CF587F-Duff is Mad【AC自动机,根号分治】

正题 题目链接:https://www.luogu.com.cn/problem/CF587F 题目大意 给出nnn个字符串sss。qqq次询问给出l,r,kl,r,kl,r,k要求输出sl..rs_{l..r}sl..r​在sks_ksk​中出现了多少次。 1≤n,q,∑∣si∣≤1051\leq n,q,\sum |s_i|\leq 10^51≤n,q,∑∣si​∣≤105 解题思路 考虑一…

牛客题霸 [最长重复子串] C++题解/答案

牛客题霸 [最长重复子串] C题解/答案 题目描述 一个重复字符串是由两个相同的字符串首尾拼接而成&#xff0c;例如abcabc便是长度为6的一个重复字符串&#xff0c;而abcba则不存在重复字符串。 给定一个字符串&#xff0c;请编写一个函数&#xff0c;返回其最长的重复字符子串…

codeforces1552 D. Array Differentiation(思维+暴力)

D. Array Differentiation 因为相减的顺序可以变化&#xff0c;所以这个环中数的正负性以及相减顺序其实是没有影响的&#xff0c;那么我们可以规定一个方向&#xff0c;然后再枚举所有可能的正负性。 设这环中点分别是 v1,v2,⋯vkv_1,v_2,⋯v_kv1​,v2​,⋯vk​&#xff0c;那…

粉刷木板(ybtoj-单调队列)

题目描述 解析 头疼 定义dp[i]:只用前i块板的最大价值 对于新加入的一个木匠&#xff1a; 不难写出dp转移式&#xff1a; dp[i]max(dp[k](i-k)*p)k表示开始刷的前一个 其中i>s i-k<l; 要是这么转移会是n^2m 所以我就不废了。。。 其实离正解很接近了 把上面移一下项&am…

P6563-[SBCOI2020]一直在你身旁【dp,单调队列】

正题 题目链接:https://www.luogu.com.cn/problem/P6563 题目大意 长度为nnn的序列aia_iai​&#xff0c;现在有一个随机[1,n][1,n][1,n]的整数&#xff0c;每次你可以花费aia_iai​询问这个数字是否大于iii&#xff0c;求猜出所有数至少要多少花费。 T≤500,∑n≤7000T\leq …

牛客题霸 [字符串的排列] C++题解/答案

牛客题霸 [字符串的排列] C题解/答案 题解&#xff1a; stl真好用&#xff0c;emmm。。。 代码&#xff1a; class Solution { public:vector<string> Permutation(string str) {if (str.empty()) return {};sort(str.begin(), str.end());vector<string>ans;i…

POJ - 3415 Common Substrings(长度不小于K的公共子串个数)

Common Substrings 后缀数组单调栈 题解1 题解2 题解3 #include<cstdio> #include<cstring> #include<iostream> using namespace std; typedef long long ll; // sa[i]: 排名是i位的是第几个后缀 // rk[i]: 第i个后缀的排名是多少 // height[i]: sa[i]与s…

跳房子(ybtoj-单调队列)

文章目录题目描述解析代码thanks for reading&#xff01;题目描述 洛谷传送门 跳房子&#xff0c;也叫跳飞机&#xff0c;是一种世界性的儿童游戏&#xff0c;也是中国民间传统的体育游戏之一。 跳房子的游戏规则如下&#xff1a; 在地面上确定一个起点&#xff0c;然后在起…

使用Dapper持久化IdentityServer4

最近研究dotnet core,微软将IdentityServer4作为推荐的服务授权和验证的组件,其独立性特别适合微服务或者分布式的服务扩展验证,所以非常受广大dotnet开发人员的青睐.默认的IdentityServer4默认使用内存对象的验证和授权,而在IdentityServer的官方推荐只有Entity Framework cor…

P5470-[NOI2019]序列【模拟费用流】

正题 题目链接:https://www.luogu.com.cn/problem/P5470 题目大意 两个长度为nnn的序列a,ba,ba,b&#xff0c;求出它们两个长度为KKK的子序列&#xff0c;且这两个子序列至少有LLL个位置下标相等。 求最大化两个子序列的和。 T≤10,1≤n≤2105,∑n≤106T\leq 10,1\leq n\leq…

牛客题霸 [数组中未出现的最小正整数] C++题解/答案

牛客题霸 [数组中未出现的最小正整数] C题解/答案 题目描述 给定一个无序数组arr&#xff0c;找到数组中未出现的最小正整数 例如arr [-1, 2, 3, 4]。返回1 arr [1, 2, 3, 4]。返回5 [要求] 时间复杂度为O(n)O(n)&#xff0c;空间复杂度为O(1)O(1) 题解&#xff1a; 如果…

再不学习我们就out了

前不久我们组来了个Graduate Developer&#xff0c;刚毕业&#xff0c;经验不多&#xff0c;有一次闹了个乌龙&#xff0c;把Stage数据库直接删掉了……好在Azure有备份&#xff0c;不然就算Stage没有重要数据&#xff0c;也得花点时间重建&#xff0c;其他的开发、测试工作都得…

矩阵快速幂一篇通

文章目录概述快速幂解析代码矩阵运算定义加法乘法单位矩阵一、斐波拉契&#xff08;基础模板&#xff09;题目描述解析代码二、行为方案&#xff08;实际应用&#xff09;题目描述解析代码三、矩阵求和&#xff08;子矩阵作为矩阵元素&#xff09;题目描述解析代码四、最短路径…

SPOJ687 Repeats(重复次数最多的连续子串)

Repeats hihoCoder 1419 后缀数组四重复旋律4(重复次数最多的连续子串) #include<bits/stdc.h> using namespace std;// sa[i]: 排名是i位的是第几个后缀 // rk[i]: 第i个后缀的排名是多少 // height[i]: sa[i]与sa[i-1] const int N50010; char s[N]; int rk[N],sa[N…