題意:有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 #include2view codeusing
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 }
張老師的旅行
張老師的旅行 題解 區間dp。區間dp的基本解題方法 列舉長度 列舉起點 那麼終點根據長度也就知道了 列舉分割點 但是本題並不需要列舉分割點,因為需要花費時間最短一定,那麼一定是從所列舉的區間的一邊一直走到另一邊,那麼是從左走到右還是從右走到左呢,這時我們就想到了dp開一維來放0,1,其中0表示從右...
張老師的期待
希望畢業後,學生的技能 1 linux 多門課程需要,盡早引導自學,目前設想大一下學期由研究生業餘時間組織學習 掌握命令 指令碼程式設計 服務配置 系統管理等 2 程式設計 組合語言 熟悉一種組合語言,有 彙編 思想 純c 建議直接採用gcc教學,c 可依興趣自學 資料結構 作業系統核心程式設計 熟...
張老師的小測試
張鑫旭老師的github 一 dl dtdd 二 存在問題及改善 1.格式與縮排的問題 2.答題點評之值得商榷的實現 萬用字元reset的問題 為了一棵樹砍掉整個森林的做法是不合適的 容器定高的問題 會降低容錯性和可維護性 50 的問題 左邊安全寬度,右側自動分配剩餘空間 有必要考慮極端內容 文字內...