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");
}
}
现在还没时间将我那种方法写出来 之后再写出来看下对不对