对于动态规划问题,可以按步骤来做:
1、分解出子问题。
2、求得子问题的最优解。
首先将问题转化为:到达一个站点 i 的最优解 。
对于每一个站点 i ,我们可以假设在第 j ( 0 < j < i ) 个站点充满电出发,一共有两种状态:
(1) 当从第j个站点到第i个的距离大于电动车能够行使的距离时,需要开与骑相结合。
(2) 当从第j个站点到第i个的距离小于电动车能够行使的距离时 ,只需要开到。
#include<iostream> #include<stdio.h> #include<limits.h> using namespace std ; int main() { int s ; while(cin >> s) { int count , can , t ; int path[110] ; double dp[110] ; cin >> count >> can >> t ; path[0] = 0 ; path[count + 1] = s ; dp[0] = 0.0 ; int v1 , v2 , v3 ; cin >> v1 >> v2 >> v3 ; for(int i = 1 ; i <= count ; i++) cin >> path[i] ; for( int j = 1 ; j <= count + 1 ; j++ ) { dp[j]=100000.0 ; for( int k = 0 ; k < j ; k++ ) { double len = ( path[j] - path[k] ) * 1.0 ; double temp = ( len > can ? (can * 1.0 / v2 + (len - can) * 1.0 / v3 ) : ( len * 1.0 / v2 ) ) ; if(k) temp += t ; dp[j] = min(dp[j] , dp[k]+temp) ; } } double tt = s * 1.0 / v1 ; if( dp[count+1] < tt ) puts("What a pity rabbit!"); else puts("Good job,rabbit!"); } return 0 ; }
HDU(2059)动态规划问题,布布扣,bubuko.com
原文:http://blog.csdn.net/ding_hai_long/article/details/20569529