2017百度校招筆試第一題 阿新 • • 發佈:2019-02-08 題意: 大概是一個小朋友去遊樂園,遊樂園一個有n個專案,第i專案需要花費a[i]時間去玩,小朋友的門票一共可以在遊樂園裡面待t時間,只要在這個時間內開始一個專案,那麼他可以等到專案結束後才離開遊樂園。問他能玩的專案時間總和最大是多少? 其中:n<=100,t<=10000000,a[i]<=100 分析: 定義:dp[n][t]表示小朋友前n個專案中,一共玩了t時間,他需要的門票的最短時間。 由此可以知道轉移方程為: dp[n][t]=min(dp[n−1][t],t−max{a[i]|i為所有被選擇的項目的腳標}+1) 容易看出來,後面更新的一塊是一個很難解決的過程。如果a[n ]是最大值,那麼方程就變成了: dp[n][t]=min(dp[n−1][t],t−a[n]+1) 但是a[n]可能不是最大值?這個時候裡面的那部分更新起來非常麻煩。 這個時候,如果我們對原序列進行一次排序, 從小到大,那麼我每一次更新的a[n]就會變成之前所有序列裡面的最大值,然後題目就做完了。 複雜度:o(n∗n∗max{a[i]})