標籤:使用 os io for ar 問題 時間 amp
比較經典的動態規劃的題目了
一般動態規劃的想法都是先判斷是否有最優子結構,無後效性。接著從狀態轉移入手,盡量細分狀態(即給定N得到N+1),完了再遞推計算
痛點:轉移方程,其一般也難在如何描述一個結點
有時候不太好做就結合使用記憶化搜尋(從大到小搜尋,因為多個小的可能會組成一個大的導致無效計算過多)
/************************************************************************//* 動態規劃三要素:1.最優子結構 一個最佳化策略的子策略總是最優的2.無後效性 它以前各階段的狀態無法直接影響它未來的決策,而只能通過當前的這個狀態3.子問題重疊 動態規劃將原來具有指數級時間複雜度的搜尋演算法改進成了具有多項式時間複雜度的演算法很明顯的狀態轉移拆分的要素是時間,這裡對於每個電樁都是一個狀態斷點,這裡添加上起點終點構成0.1.2...N+1種狀態對於某一個電樁,其最佳化策略是 min(之前各個電樁最優狀態下加上充電時間)dp[i]=min(dp[j])+T;0<=j<i<=N+1*//************************************************************************/#include <iostream>#include <cstdio>#include <vector>#include <string>#define maxn 100+10int L,C,T,N,VR,V1,V2,M,num;float dp[maxn];int charge[maxn];int main(){ int i,j,k;float tmp,rabbit,TV1,ans; while(scanf("%d%d%d%d%d%d%d",&L,&N,&C,&T,&VR,&V1,&V2)!=EOF) {for(i=1;i<=N;i++)scanf("%d",charge+i);dp[0]=-1*T;//剛開始不用充電charge[0]=0;//補充充電樁charge[N+1]=L;//補充充電樁TV1=C/(V1+0.0);//計算騎在最大可行距離C下,電動車用時rabbit=L/(VR+0.0);//計算兔子用時for(i=1;i<=N+1;i++){ans=1e9;//求dp[i]最小值for(j=0;j<i;j++){tmp=dp[j];k=charge[i]-charge[j];if(C<k)//判斷可否一次性用電動車騎完tmp+=TV1+(k-C+0.0)/V2;elsetmp+=k/(V1+0.0);ans=ans>tmp?tmp:ans;//求dp[i]最小值}dp[i]=ans+T;}if(dp[N+1]<rabbit)printf("What a pity rabbit!\n");elseprintf("Good job,rabbit!\n");} return 0;}