HDOJ 2059(dp入门)

HOOJ 2059(dp入门)(详解)

##c语言
题目链接(点我!!)
自己遇到的第一道dp题,搞了很久才弄明白,敲的比较艰难,有必要记录一下~~
本人还是萌新QAQ,轻喷~~
转移方程 dp[i] = min{dp[i], dp[j] + time(p[i] - p[j]) + t}
欢迎各位大佬指教!!
AC代码:

#include
double dp[150],s[150];//记录到每一站的最短用时,记录每个充电站到起点的距离
double MIN(double m,double n)
{
     
	return m>n?n:m;
}
int main()
{
     
	int N;//充电站个数
	double vr,v1,v2;//兔子,电动车,jio蹬的速度
	double L;//长度
	int i,j;
	double x,t;//电瓶车有电行驶最大长度,充电时间
	double len; //用来记录两个充电站之间的路程
	double time;
	double tr;//记录兔子的用时
	while(scanf("%lf",&L)!=EOF)
	{
     
		scanf("%d%lf%lf",&N,&x,&t);
		scanf("%lf%lf%lf",&vr,&v1,&v2);
		tr = L/vr ;//兔子耗时
		for(i = 1;i <= N;i++)
		{
     
			scanf("%lf",&s[i]);
		}
		s[0] = 0;//开始的距离为0
		dp[0] = 0;//开始的最短用时为0
		s[N+1] = L;
		for(i = 1;i <= N+1;i++)
		{
     
			dp[i] = tr + 1;//,dp[i]暂且未知,我门先初始化为比兔子耗时还大的时间
		 	for(j = 0;j < i;j++)
		 	{
     
		 		len = s[i] - s[j];//第j个充电站到第i个充电站之间的距离差
		 		if(len < x)
		 		{
     
		 			time = len/v1;//如果距离差小于x,耗时直接为路程/速度
		 		}
		 		else
		 		{
     
		 			time = x/v1+(len-x)/v2;//如果距离差大于x,耗时为x/v1+(x-len)/v2
		 		}
		 		if(j>0)//这是用来判断,j是不是起点,如果是起点就不用加充电时间,否则还要加上充电的时间
		 		{
     
		 			time+=t;
		 		}
		 		time+=dp[j];//在加上到第j个充电站的最短用时;
		 		dp[i] = MIN(dp[i],time);//跟新dp[i],看看是否有比现在的dp[i]更短的用时。
		 	}
		}
		if(dp[N+1] < tr)
		printf("What a pity rabbit!\n");
		else
		printf("Good job,rabbit!\n");
	} 
	return 0;
}


你可能感兴趣的:(c语言,c语言)