POJ 1042 Gone Fishing( DP )
题意:小明打算做一个h((1 <= h <= 16))个小时钓鱼旅行。发现这里有n(2 <=
n <= 25)个湖,而且所有的湖都在一条路的旁边。小明打算从第1个湖开始钓起,每在一个湖钓完鱼后,要到下一个湖但他可以选择是否要在这里钓鱼,并且他可以在任何一个湖结束他此次钓鱼的行程。输入给出小明在每个湖中单位时间内(5分钟)钓的鱼数fi[i],以及随单位时间的增长而线性递减di[i]。没到下一个湖所需的时间为ti[i](单位时间)。求怎么样选择钓鱼的湖使得小明钓到最多的鱼,以及在每个湖钓鱼的用时。
分析:开始就想到用DP,用dp[i][j]表示前i个湖用时j个单位时间时钓到的最多鱼数。状态转换方程为:dp[i][j]=Math.max(dp[i-1][j-k-ti[i-1]]+fishs
, dp[i][j]),ti[i-1]为从第i-1个湖到第i个湖所用的时间,fishs为在k个时间单位内小明在第i个湖钓到的鱼数;但是这样求在每个湖的逗留时间有点不方便,后来发现可以再写个方法,从DP的逆过程中找到每个湖的用时。分析到这里已经可以开始写代码了,但是由于小弟的DP学的不扎实,在实现的时候还是遇到了困难。比如,dp方程是在dp[i-1][j-k-ti[i-1]]上加上fishs,这就给dp的初始化带来了麻烦。而如果是用方程dp[i][j]=Max{
dp[i-1][j-k-t[i]] , dp[i][j]+fishs }就是在dp[i][j]的基础上加上fishs,这样的初始化就很简单了。不过最初的永远是最难忘的,就像初恋一样!哎,我还是实现了我的最初想法,不过就是有点繁琐。怎么实现的呢,就是先算出不是最佳的方案,算出每个湖能钓到的鱼数,不管是不是整个过程中最多的。有点说不清楚,dp[i][j]=dp[i][j-1]+m;m就是一个单位时间内在第i个湖中钓到的鱼数。这样就完成了初始化了,在套用上面的dp就OK了。但是考虑到实用性的话,还是用另一种方案好了,简单易懂。
import java.util.Scanner; public class Main{
static int[] fi;
static int[] di;
static int[] ti;
static int[] pi;
static int[][] dp; static void path(int i, int time){
if(i==0)
return;
int summ=0;
for(int k=0; k<=time; ++k){
if(dp[i-1][time-k-ti[i-1]]+summ==dp[i][time]){
pi[i]=k*5;
path(i-1,time-k-ti[i-1]);
return ;
}
if (fi[i]-k*di[i]>0)
summ=fi[i]*(k+1)-(k+1)*k/2*di[i];
}
return;
}
static void DP(int n,int time){
dp[0][0]=0;
for(int i=0; i<=n-1; i++)
for(int j=0; j<=time; j++){
int summ=0;
for(int k=0; k<=time && dp[i][j]!=-1; k++){
if(j+k+ti[i]<=time)
dp[i+1][j+k+ti[i]]=Math.max(dp[i+1][j+k+ti[i]],dp[i][j]+summ);
else
break;
if (fi[i+1]-k*di[i+1]>0)
summ=fi[i+1]*(k+1)-(k+1)*k/2*di[i+1];
}
}
} public static void main(String args[]){
Scanner sc=new Scanner(System.in);
int n,hours,i,j,time;
while(true){
n=sc.nextInt();
if(n==0){
break;
}
hours=sc.nextInt();
time=hours*12;
dp=new int[n+1][time+1];
fi=new int[n+1];
di=new int[n+1];
ti=new int[n];
pi=new int[n+1];
for(i=1;i<=n;i++)
fi[i]=sc.nextInt();
for(i=1;i<=n;i++)
di[i]=sc.nextInt();
for(i=1;i<n;i++){
ti[i]=sc.nextInt();
}
for(i=0;i<=n;i++)
for(j=0;j<=time;j++)
dp[i][j]=-1;
DP(n,time);
int max=0,index=1;
for(i=1;i<=n;i++){
if(max<dp[i][time]){
max=dp[i][time];
index=i;
}
}
path(index,time);
for(i=1;i<=n-1;i++)
System.out.print(pi[i]+", ");
System.out.println(pi[n]);
System.out.println("Number of fish expected: "+max);
System.out.println();
}
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 1042 Gone Fishing( DP )的更多相关文章
- POJ #1042 Gone Fishing - WA by a DP solution. TODO
I used DP instead of Greedy. But got WA on PoJ, though it passed all web-searched cases. Maybe I hav ...
- POJ 1042 Gone Fishing
题意:一个人要在n个湖中钓鱼,湖之间的路径是单向的,只能走1->2->3->...->n这一条线路,告诉你每个湖中一开始能钓到鱼的初始值,和每钓5分钟就减少的数量,以及湖之间的 ...
- POJ 1042 Gone Fishing (贪心)(刘汝佳黑书)
Gone Fishing Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 30281 Accepted: 9124 Des ...
- poj -- 1042 Gone Fishing(枚举+贪心)
题意: John现有h个小时的空闲时间,他打算去钓鱼.钓鱼的地方共有n个湖,所有的湖沿着一条单向路顺序排列(John每在一个湖钓完鱼后,他只能走到下一个湖继续钓),John必须从1号湖开始钓起,但是他 ...
- POJ 1042 Gone Fishing#贪心
(- ̄▽ ̄)-* #include<iostream> #include<cstdio> #include<cstring> using namespace std ...
- POJ.3624 Charm Bracelet(DP 01背包)
POJ.3624 Charm Bracelet(DP 01背包) 题意分析 裸01背包 代码总览 #include <iostream> #include <cstdio> # ...
- POJ 2995 Brackets 区间DP
POJ 2995 Brackets 区间DP 题意 大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配.需要注意的是这里的匹配规则. 解题思路 区间DP,开始自己没想到是区间 ...
- Poj/OpenJudge 1042 Gone Fishing
1.链接地址: http://bailian.openjudge.cn/practice/1042/ http://poj.org/problem?id=1042 2.题目: Gone Fishing ...
- Gone Fishing POJ 1042
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> us ...
随机推荐
- [ubuntu]安装adobe air
修改安装文件为可执行权限: sudo ./AdobeAIRInstaller.bin 提示错误: <code> Adobe AIR could not be installed. Inst ...
- 我的Android进阶之旅------>四种呼叫转移场景
运行商为我们提供了如下4中呼叫转移场景: 1.始终进行呼叫转移:不管当前手机处于何种状态,来电都会被转移到指定的电话号码上.在使用这种呼叫转移时应当非常小心,如果启用了这种呼叫转移,你可就永远也接不着 ...
- docker 存储定义成direct-lvm 模式
配置direct-lvm模式 1. 停止Docker systemctl stop docker 2. 安装依赖包 device-mapper-persistent-data,lvm2, and ...
- You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
[root@localhost dreamstart]# composer installLoading composer repositories with package informationI ...
- 网络端口的作用及分类(转发:http://blog.csdn.net/dream_1996/article/details/73481201)
一.什么是端口? 在开始讲什么是端口(port)之前,我们先来聊一聊什么是 port 呢?常常在网络上听说『我的主机开了多少的 port ,会不会被入侵呀!?』或者是说『开那个 port 会比较安全? ...
- 错误解决Error configuring application listener of class org.springframework.web.util.Log4jConfigListener(转发)
Spring MVC-----maven项目导入后启动tomcat出现如下错误 参考:http://blog.csdn.net/itlionwoo/article/details/17523371 解 ...
- Ubuntu安装教程
http://www.linuxdiyf.com/linux/13198.html 简易配置说明 磁盘分区,新分区的磁盘必须是未分配的, 到管理-磁盘管理下面查看磁盘是不是未分配的,如果已分配了,在磁 ...
- javascript操作常见的html标签
几乎HTML所有标记都可以说是HTML的控件,如select, input, div, table等.html标签便捷的操作,深受大家的喜欢.现在的大部分网站都是ajax+json来进行数据传送.所以 ...
- WampServer修改MySQL密码的问题
WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就 一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入原密码,如果是空,直接按 ...
- linux限制用户内存使用
最近有内存使用报警的邮件发出,之后杀掉了内存占用高的进程,使内存恢复正常 但是发现某些程序被杀掉了,有过怀疑是被人手动杀掉的,看日志后发现应该是内存占用过大,系统自动杀掉的 内存耗尽会调用oom 对进 ...