【2010福建】收稻子 (校BSOJ1114)
农夫有n块农田,农田里种满了稻子。秋天到了,稻子熟了,每块农田都有一定数量的稻子。我们可以把农田看成n个点,编号是1到n。农夫起点编号是1。恰好有n-1条道路连接这些点,每条道路长度都为1,并且任意2点都是可达的。每条道路都有一定的长度。现在农夫从起点出发,到农田收割稻子。农夫每经过一块农田就能收割该农田里的稻子。但是农夫是如此的懒惰,他可不想走过的总路程超过m。农夫应该如何选择一种收割方案使得到的稻子最多。农夫最后可以停在任意点!
Input
第一行一个正整数n(1<=n<=100)表示农田数;
第二行n个整数(不大于1000)表示每块农田的稻子数。
接着n-1行每行两个整数a,b,表示a和b之间有一条长度为1的道路,道路是双向的。
最后一行一个整数m(0<=m<=200)表示农夫最多走m的路程。
2
1 1
1 2
1
Output
输出一个整数,表示农夫能得到最多的稻子。
2
根据题目的数据范围,n<=100,m<=200,想到树形dp。
令1为根,设g[i][j]表示在i为根的子树中,以i为起点,最多走j的路程,得到的最多麦子数。
ans=g[1][m]
但只设一个并不能写出转移方程,比如节点i,它可能走向一个儿子y1,然后返回到 i,再走向另一个儿子y2。
所以这里设一个辅助用的数组f
设f[i][j]表示在i为根的子树中,以i为起点,最多走j的路程,又回到了 i,得到的最多麦子数。
令y为i的一个儿子
方程: (走y后又回来) g[i][j]=max(g[i][j],g[i][j-k-2]+f[y][k]);
(走y后不回来)g[i][j]=max(g[i][j],f[i][j-k-1]+g[y][k]);
f[i][j]=max(f[i][j],f[i][j-k-2]+f[y][k]);
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std; 8 int n,m,cnt; 9 int h[105]; 10 int v[105]; 11 int f[105][205],g[105][205]; 12 struct node{int to,next;}a[205]; 13 void add(int x,int y){cnt++;a[cnt].to=y;a[cnt].next=h[x];h[x]=cnt;} 14 void dp(int x,int fa) 15 { 16 int i,j,k,y; 17 for(i=0;i<=m;i++)f[x][i]=g[x][i]=v[x]; 18 for(i=h[x];i;i=a[i].next) 19 { 20 y=a[i].to; 21 if(y==fa)continue; 22 dp(y,x); 23 for(j=m;j>=0;j--) 24 for(k=0;k<=j-2;k++) 25 g[x][j]=max(g[x][j],g[x][j-k-2]+f[y][k]); 26 for(j=m;j>=0;j--) 27 for(k=0;k<=j-1;k++) 28 g[x][j]=max(g[x][j],f[x][j-k-1]+g[y][k]); 29 for(j=m;j>=0;j--) 30 for(k=0;k<=j-2;k++) 31 f[x][j]=max(f[x][j],f[x][j-k-2]+f[y][k]); 32 } 33 } 34 int main() 35 { 36 int n,x,y,i; 37 cin>>n; 38 for(i=1;i<=n;i++)scanf("%d",&v[i]); 39 for(i=1;i<=n-1;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x); 40 cin>>m; 41 dp(1,0); 42 cout<<g[1][m]; 43 return 0; 44 }
转载于:https://www.cnblogs.com/dsb-y/p/11427379.html
【2010福建】收稻子 (校BSOJ1114)相关推荐
- 双非一本考研国防科技大学计算机,【21择校】这些高校不歧视双非,保护一志愿!...
"考得好不如选得好",选一个对的学校真的很重要!今天跟大家分享20余所不歧视本科,保护一志愿的"良心"大学!考研占比人数最多的就是双非的同学,所以要优先选择歧不 ...
- 不歧视双非的计算机院校,【21择校】这些高校不歧视双非,保护一志愿!
" 考得好不如选得好 ",选一个对的学校真的很重要!今天跟大家分享 20 余所不歧视本科,保护一志愿的 " 良心 " 大学!考研占比人数最多的就是双非的同学,所 ...
- 漂移的农民工,何处才是你的浮木
漂移的农民工 正月十五过后,农民工们又开始了在乡村与城市之间浩浩荡荡的"漂移".中央农村工作领导小组办公室主任陈锡文说,中国今年大约有两千万农民工由于经济不景气而失去工作. 乡村已 ...
- 基于matlab的硅晶体模型,基于Matlab的图像处理技术识别硅太阳电池的缺陷
第 44 卷 第 7 期 2010 年 7 月 上 海 交 通 大 学 学 报 JOURNAL OF SHANGHAI J IAOTON G UNIVERSITY Vol. 44 No. 7 Jul. ...
- 计算机考研不压分的学校,考研院校里,这些学校不压分、不歧视专科生,值得关注...
原标题:考研院校里,这些学校不压分.不歧视专科生,值得关注 1.大连理工大学 @zxh 大连理工复试极其公平,上午面试完,直接下午就出总成绩.晚点的也就晚上出成绩,而且保护一志愿. 2.辽宁大学 @毒 ...
- 《统一沟通-微软-实战》-3-部署-Exchange 2010-4-基本配置
参照: 使用Exchange 2010的几个注意事项 http://wangchunhai.blog.51cto.com/225186/152384 备注: 文字来源于网站,图片来源于-<统一沟 ...
- 晓庄学院计算机科学分数,南京晓庄学院计算机单招分数
技校网专门为您推荐的类似问题答案 问题1: 南京晓庄学院的计算机专业 晓庄排名太低计算机实力也弱 你的分这么高 上了浪费 建议上南京林业大学或其它符合等级的外省一流学校 问题2: 有南京晓庄学院 行知 ...
- 高考计算机模拟系统,高考工厂模拟
今天小编为大家带来了一款有趣的模拟游戏<高考工厂模拟>,这是一款以经营中国高中为题材的模拟游戏,在高考工厂模拟游戏里玩家将扮演高中校长将一所普通高中提升为全省最好的学校,并且让每个学生都考 ...
- mbsfn子帧_LTE多媒体广播多播业务关键技术研究
基金项目:国家重大专项(2010ZX03003-004) 随着互联网的迅速发展和大屏幕多功能用户设备的普及,出现了大量移动数据多媒体业务和各种高带宽多媒体业务,如视频会议.电视广播.视频点播.广告.网 ...
最新文章
- 大数据时代的网络视频营销
- 页面整体居中 左右出现白边html,html2canvas生成图片出现白边儿的解决方法
- mysql proxy读写分离实现_使用mysql-proxy实现读写分离
- 使用OpenCV创建视频
- 获取控制器 nextResponder的简单应用
- html css important,css中的important是什么意思?
- linux 信号集 同步,linux信号集
- zoj 2678 Bishops on a Toral Board 同余方程组,完系(3-I)
- 2022-04微软漏洞通告
- Android APK文件反编译 查看appid等信息
- 嵌入式--接口--MIPI接口
- Optimistic Concurrency VS. Pessimistic Concurrency Control
- 亲情的矛盾都是因为爱而化解 写给17 岁的你
- Python小工具:批量给视频加水印
- 计算机用户名大小写,windows计算机名大小写
- OSPF协议(NA、NP知识)
- Dubbo的示例文档
- 学生管理系统(超详细)
- 宅公司 宅家里 养生锻炼必备的少林八段锦
- Hadoop MapReduce 统计汽车销售信息
热门文章
- 地砖中间高四边低_地砖上墙到底好不好?幸好我家没这么做否则全毁了!
- java ip吸附_IP层的封装(Java的InetAddress类的C++实现)
- 程序员广交四海朋友群
- c语言cobegin用法,用C语言实现P、V操作
- 炼油机出来的什么油_小型精炼油设备10来万一套供不应求,油作坊提高油品质量才有出路...
- 利用localStorage本地储存js文件
- matplotlib(四)核心模式以及注意事项
- 《数据库SQL实战》查找所有已经分配部门的员工的last_name和first_name
- Java路径问题最终解决方案—可定位所有资源的相对路径寻址
- JVM实用参数(二)参数分类和即时(JIT)编译器诊断