poj 2059 龟兔赛跑 DP

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liyanfeng1996/article/details/52744753

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");
	}
}

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



展开阅读全文

没有更多推荐了,返回首页