HDU 1520Anniversary party(树型DP)

本文介绍了一种使用树形动态规划解决派对趣味性问题的方法,通过计算每个参与者的最大权值来确保派对的趣味性不受直接上司的影响。

HDU 1520   Anniversary party

题目是说有N个人参加party,每个人有一个rating值(可以理解为权值)和一个up(上司的编号),为了保证party的趣味性,每一个人不可以和他的直接上司都参加,问最后的rating和最大

这是一个典型的树形DP,DP[i][0]表示i不参加那他的这棵子树上的最大权值,DP[i][1]表示i参加时的这棵树上的最大权值,那么:

        DP[i][0] = sum{MAX(DP[j][1], DP[j][0])  |  j是i的直接子节点}

        DP[i][1] = sum{DP[j][0]  |  j是i的直接子节点}        

 1 //#pragma comment(linker,"/STACK:102400000,102400000")
 2 #include <map>
 3 #include <set>
 4 #include <stack>
 5 #include <queue>
 6 #include <cmath>
 7 #include <ctime>
 8 #include <vector>
 9 #include <cstdio>
10 #include <cctype>
11 #include <cstring>
12 #include <cstdlib>
13 #include <iostream>
14 #include <algorithm>
15 using namespace std;
16 #define INF 1e9
17 #define inf (-((LL)1<<40))
18 #define lson k<<1, L, mid
19 #define rson k<<1|1, mid+1, R
20 #define mem0(a) memset(a,0,sizeof(a))
21 #define mem1(a) memset(a,-1,sizeof(a))
22 #define mem(a, b) memset(a, b, sizeof(a))
23 #define FOPENIN(IN) freopen(IN, "r", stdin)
24 #define FOPENOUT(OUT) freopen(OUT, "w", stdout)
25 template<class T> T CMP_MIN(T a, T b) { return a < b; }
26 template<class T> T CMP_MAX(T a, T b) { return a > b; }
27 template<class T> T MAX(T a, T b) { return a > b ? a : b; }
28 template<class T> T MIN(T a, T b) { return a < b ? a : b; }
29 template<class T> T GCD(T a, T b) { return b ? GCD(b, a%b) : a; }
30 template<class T> T LCM(T a, T b) { return a / GCD(a,b) * b;    }
31 
32 //typedef __int64 LL;
33 //typedef long long LL;
34 const int MAXN = 6010;
35 const int MAXM = 100005;
36 const double eps = 1e-13;
37 //const LL MOD = 1000000007;
38 
39 int N, a[MAXN], dp[MAXN][2];
40 int fa[MAXN];
41 vector<int>e[MAXN];
42 
43 void DFS(int u)
44 {
45     int s0 = 0, s1 = 0;
46     for(int i=0;i<e[u].size();i++)
47     {
48         DFS(e[u][i]);
49         s0 += MAX( dp[e[u][i]][0], dp[e[u][i]][1] );
50         s1 += dp[e[u][i]][0];
51     }
52     dp[u][0] = s0;
53     dp[u][1] = s1 + a[u];
54 }
55 
56 int main()
57 {
58     //FOPENIN("in.txt");
59     while(~scanf("%d", &N))
60     {
61         mem0(dp);
62         for(int i=1;i<=N;i++)
63         {
64             scanf("%d", &a[i]);
65             fa[i] = i;
66             e[i].clear();
67         }
68         int x, y;
69         while(scanf("%d %d", &x, &y) && (x||y) ){
70             e[y].push_back(x);
71             fa[x] = y;
72         }
73         int ans = 0;
74         for(int i=1;i<=N;i++) if(fa[i] == i)
75         {
76             DFS(i);
77             ans += MAX(dp[i][0], dp[i][1]);
78         }
79         printf("%d\n", ans);
80     }
81     return 0;
82 }

 

转载于:https://www.cnblogs.com/gj-Acit/p/3888293.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值