每日一dp(2)——龜兔賽跑(hdu 2059)

來源:互聯網
上載者:User

標籤:使用   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;}




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.