poj 2059 龟兔赛跑 DP

poj 2059 龟兔赛跑 DP

简单dp 思路很简单  一开始想的时候就想出了 以f[i]为最后一个站到达时间最短   确定了这种思路是正确的 然后写出了转移方程  f[i]=f[i-1]+min(要加油的时间,不加油的时间)  这里前面的c不归0 但是  但是  但是  我没写出代码来  这种转移

方程代码好难写啊  后面百度题解 发现转移方程不是我这么写的  f[i]=min(f[j]+time(j))(0<=j<i) 这么写的话就是每次遇到j就加油 c归0  直接就把不加油的方案算进去了 

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=101;
const int INF=999999;
int main()
{
	double L;
	int n;
	double c,t;
	double vr,vt1,vt2;
	while(~scanf("%lf",&L))
	{
		double dis[MAXN];
		scanf("%d",&n);
		scanf("%lf%lf",&c,&t);
		scanf("%lf%lf%lf",&vr,&vt1,&vt2);
		for(int i=1;i<=n;i++)
			scanf("%lf",&dis[i]);
		
		dis[0]=0;//起点存入
		dis[n+1]=L;	//终点存入
		double dp[MAXN]={0};
		for(int i=1;i<=n+1;i++)
		{
			dp[i]=INF;
			for(int j=0;j<i;j++)
			{
				double time=0;	
				double len=dis[i]-dis[j];
				time=c>=len?dp[j]+len/vt1:dp[j]+c/vt1+(len-c)/vt2;
				if(j!=0)		//一开始就充满电不需要时间
					time+=t;
				dp[i]=min(dp[i],time);    //每次取最小
			}
		}
		double tr=L / vr;	//兔子的时间
		if(tr <dp[n+1])
			printf("Good job,rabbit!\n");
		else
			printf("What a pity rabbit!\n");
	}
}

现在还没时间将我那种方法写出来  之后再写出来看下对不对



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值