HDOJ2059_龟兔赛跑_DP动态规划入门

如题可知,兔子比赛的时间已知,就是判断乌龟用时是否小于兔兔。

我们可以将每个充电站以及起点和终点视为状态点,那就可以开一个Time_turtle[N+2]的数组来存储在每个充电站时的最优时间。

其状态转移方程为 Time_turtle[i]=Time_turtle[j]+min{充电[j],不充电[j]}; (从j点到i点的最佳时间为j点之前的最佳时间,加上选择充电或者不充电时的最小时间)

值得注意地是,每点的状态选择后实际上会影响后续的所有选择,所以要开一个二重循环。顺着枚举每个充电站i,然后在倒着枚举i前面的j个充电站的状态来进行比较。

#include <iostream>
using namespace std;

double min(double x,double y){
	return x>y?y:x;
}	//判断大小
 
int main(){
	double T,C,L,vr,vt1,vt2;int N;
	while(cin>>L){
		cin>>N>>C>>T;
		cin>>vr>>vt1>>vt2;
		double time_rabbit=L/vr;
		//存储每个充电站之间的距离。
		double s[102];
		for(int i=1;i<=N;i++){
			cin>>s[i];
		}
		s[0]=0,s[N+1]=L;	//记录起点和终点的位置		 
	
		double Time_turtle[102]={0},time;	
		//Time_turtle为动态规划数组,记录到每个收费站时的最小时间 
	        //起点时为时间为0; 
		//第一重循环表示在第i充电站时,
		for(int i=1;i<N+2;i++){
			Time_turtle[i]=0xffffff;	//由于初始,i点的最小值未知故设为无穷大 
			for(int j=0;j<i;j++){
				if(s[i]-s[j]<C)time=(s[i]-s[j])/vt1;	//比较i点收费站到j点距离与充电最大行驶距离的大小 
				else time=(s[i]-s[j]-C)/vt2+C/vt1; 		//大于则直接除以充电速度,否则要加上用脚蹬的时间
				time+=Time_turtle[j];	//默认j后的点均为不充电,加上j前的点的最优时间 
				if(j>0)time+=T;        	//由于起点是充满电的,所以要判断一下
				Time_turtle[i]=min(Time_turtle[i],time);	//比较的是不充电时和充电时那个更小。 
			} 
			
		}	//存储最优化的时间
		//cout<<Time_turtle[N+1]<<" "<<time_rabbit<<endl;
		if(Time_turtle[N+1]<time_rabbit)cout<<"What a pity rabbit!\n";
		else cout<<"Good job,rabbit!\n"; 
	}
	return 0;
} 


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值