C 張老師的旅行 區間DP

2022-06-02 04:12:12 字數 1062 閱讀 3705

題意:有n個直線排列的城市(可以看作是一條從原點到正半軸的x軸),a[i]表示i城市在這條x軸上的位置

有每乙個城市所需到達的最低時間。

問:能否在規定時間內訪問所有的城市,訪問的最少時間為多少?

如果不能的話,輸出-1

思路:按題目中給出,有乙個起點。我們就得從這個起點向左右走來列舉出走到乙個【l,r】內的最少時間

要列舉乙個區間內的最優情況,即為區間dp

假定我們要走到乙個區間為【l,r】,那麼會有兩種情況

一種是停在l,一種停在r,分別用0 ,1表示

於是,針對每乙個情況如下:

停在0,即l,要想停在l,我們進行操作的區間即為【l+1,r】,有兩種情況 

tmp=dp[i+1][j][0]+abs(a[i+1]-a[i]);

if (t[i]>=tmp) dp[i][j][0]=min(dp[i][j][0],tmp);

tmp=dp[i+1][j][1]+abs(a[j]-a[i]);

if (t[i]>=tmp) dp[i][j][0]=min(dp[i][j][0],tmp);

停在1,即r,也有兩種情況,類似上面

1 #include2

using

namespace

std;

3 typedef long

long

ll;4

const

int m=1e3+5;5

const

int inf=0x3f3f3f3f;6

int dp[m][m][2

],a[m],t[m];7//

0表示停在左邊,1表示停在右邊

8int

main()

37int ans=min(dp[1][n][0],dp[1][n][1

]);38

if(ans>=inf)

39 ans=-1

;40 printf("

%d\n

",ans);

41return0;

42 }

view code

張老師的旅行

張老師的旅行 題解 區間dp。區間dp的基本解題方法 列舉長度 列舉起點 那麼終點根據長度也就知道了 列舉分割點 但是本題並不需要列舉分割點,因為需要花費時間最短一定,那麼一定是從所列舉的區間的一邊一直走到另一邊,那麼是從左走到右還是從右走到左呢,這時我們就想到了dp開一維來放0,1,其中0表示從右...

張老師的期待

希望畢業後,學生的技能 1 linux 多門課程需要,盡早引導自學,目前設想大一下學期由研究生業餘時間組織學習 掌握命令 指令碼程式設計 服務配置 系統管理等 2 程式設計 組合語言 熟悉一種組合語言,有 彙編 思想 純c 建議直接採用gcc教學,c 可依興趣自學 資料結構 作業系統核心程式設計 熟...

張老師的小測試

張鑫旭老師的github 一 dl dtdd 二 存在問題及改善 1.格式與縮排的問題 2.答題點評之值得商榷的實現 萬用字元reset的問題 為了一棵樹砍掉整個森林的做法是不合適的 容器定高的問題 會降低容錯性和可維護性 50 的問題 左邊安全寬度,右側自動分配剩餘空間 有必要考慮極端內容 文字內...