hdu 4399 树形dp
2016-01-25 14:45
363 查看
题意比较难理解>-<,其实做起来还是比较容易的。只要从父节点往下就行了,根本都还不用通过兄弟节点更新节点。
//hdu 4799 树形dp #include <cstdio> #include <algorithm> #include <iostream> #include <string.h> #include <vector> #define inf 0x3f3f3f3f #define lowbit(x) ((x)&(-x)) #define maxn 50055 using namespace std; int dp[maxn][5],val[maxn],sta[maxn],fl[maxn],n,x,y,fa[maxn]; vector<int> g[maxn]; int cal(int a) { if(fl[a]==0) return x; else return y; } void dfs(int a,int b) { int cnt=0; if(b%2!=0) sta[a]=1-sta[a]; if(fl[a]==1) cnt=y; else cnt=x; dp[a][0]=val[a]*(1-sta[a])-sta[a]*val[a]; dp[a][1]=val[a]*sta[a]-(1-sta[a])*val[a]-cnt; for(int i=0;i<g[a].size();i++) { int j=g[a][i]; dfs(j,b+fl[j]); if(a==0) dp[a][0]+=max(dp[j][1],dp[j][0]); else { dp[a][1]+=max(dp[j][1]+cal(j),dp[j][0]-cal(j)); dp[a][0]+=max(dp[j][1],dp[j][0]); } //printf("dp[%d][1]=%d dp[%d][0]=%d \n",a,dp[a][1],a,dp[a][0]); } } int main () { //freopen("d:\\in.txt","r",stdin); while(scanf("%d%d%d",&n,&x,&y)==3) { for(int i=0;i<=n;i++) g[i].clear(); for(int i=1;i<=n;i++) { scanf("%d%d%d%d",&val[i],&fa[i],&fl[i],&sta[i]); g[fa[i]].push_back(i); } val[0]=0; fl[0]=0; sta[0]=0; memset(dp,0,sizeof(0)); dfs(0,0); if(max(dp[0][0],dp[0][1])<0) printf("HAHAHAOMG\n"); else printf("%d\n",max(dp[0][0],dp[0][1])); } return 0; }
相关文章推荐
- Linux c中一些常用函数总结(c语言中文网。。。)
- 第一天开始写博客
- JAVA JXL API的详细使用
- 组合模式
- Android开发工具全集
- hud-1754-I Hate It(线段树)
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
- loginUtil
- Visual Studio中的文件类型(sln vcproj suo user ncb)
- 八皇后问题及其推广
- 数字图像处理10--基于特征提取的拼接方法
- RHCE 学习笔记(12) 归档压缩和文件传递
- 周爱民:真正的架构师是没有title的(图灵访谈)
- 贪心算法,递归算法,动态规划算法比较与总结
- 机器学习算法之决策树(三)
- C#使用iTextSharp打印PDF
- Windows Server 2008 R2 RDS在线激活
- ubuntu 环境下开发android 程序,识别手机步骤。
- jquery ui dialog替代confirm实例分析
- leetcode之Remove Linked List Elements