POJ 1042 解题报告

题目要求:一条路上有N个湖。John刚开始在第1个湖。他可在其中选择若干湖来钓鱼。每到达一个湖,他或者直接走过去下一个湖,或者停留钓鱼。钓鱼的时间必须为5分钟的倍数

。已知第i个湖到第i+1个湖需行t[i]时间。每个湖内初始有鱼的数目为f[i]。当在第i个湖钓鱼时,每过5分钟,该湖鱼的数目以d[i]的速度在减少直到为0。问John如何选择,能钓

到最多数量的鱼。即求在每个湖停留多长时间以及最大的数量为多少。另外,John不必每个湖都要到。如果有多个解,John优先将时间花在编号较小的湖。John总共有h时间。
思路:可以选择DP。除题目要求所提到的数组外,还可设置以下数据结构:
1:b[i],表示从第1个湖到第i个湖所要花的时间。当然b[1]=0。其余的可按公式b[i+1]=b[i]+t[i]递推。
2:m[i][j],表示若分配j时间,从第i个湖第n个湖可捕到鱼的最大数目。这里n表示John能到达的最远的湖。在计算b[i]的过程中,可算出。
3:p[i][j],记录在第i个湖到第n个湖分配j时间时,若想捕到最大数目的鱼,在第i湖所花的时间。
显然m[1][h]即为所求。
先可给定m[][],p[][]初始值。P[i][j]=j。即若第i个湖到第n个湖分配了j时间,将j时间全部花在第i个湖。根据f[i],d[i]可算出m[i][j]的初始值。
不难发现,有动态转移方程:
1.若j<=t[i],m[i][j]=m[i][j],p[i][j]=j。(j时间尚不足以从i湖到i+1湖,只有全花在第i湖)
2.若j>t[i],m[i][j]=max{m[i][j],m[i][k]+m[i+1][j-k-t[i]]},0<=k<j-t[i],p[i][j]可在比较过程中记录下来。
先由三重循环  for(i=n-1;i>1;i--),for(j=h-b[i];j>t[i];j--),for(k1=j-t[i]-1,k2=1;k1>=0;k1--,k2++)。求出m[i][j]和p[i][j](1<i<=n)
然后由循环for(k1=h-t[1]-1,k2=1;k1>=0;k1--,k2++)算出m[1][h]和p[1][h]。最后根据p[i][j]回溯,即可算出在各个湖所花的时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值