标签:
ps:终于解决了。。。。卡了我好久。最后用了DP。然后还有记忆化搜索优化了一下。终于AC了
思路:要计算dp[n](就是到第n个站的最短时间,也就是最优方案),必须知道dp[0]到dp[n-1]
设j是上一个站的充电,j从0开始循环,找出最优充电站,一直循环到n-1.然后取这里面的最小值.
代码:
#include "stdio.h" #include "string.h" int L,N,C,T,VR,VT1,VT2; int p[110]; double dd[110]; double dp(int n){ int i; if(n==0) return 0.0; if(dd[n]>0.0) return dd[n]; int len; double time,min; min=100000000.0; for(i=0;i<n;i++){ len=p[n]-p[i]; if(len>=C){ time=(double)(len-C)/VT2+(double)C/VT1; } else{ time=(double)len/VT1; } if(i) time+=T; if(dp(i)+time<min){ min=dp(i)+time; } } return dd[i]=min; } int main(){ int i; double time2; while(~scanf("%d",&L)){ scanf("%d%d%d",&N,&C,&T); scanf("%d%d%d",&VR,&VT1,&VT2); memset(dd,-1,sizeof(dd)); for(i=1;i<=N;i++){ scanf("%d",&p[i]); } p[0]=0; p[N+1]=L; time2=(double )L/VR; if(dp(N+1)>time2*1.0) printf("Good job,rabbit!\n"); else printf("What a pity rabbit!\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/sureli/p/5304442.html