東秦第四屆圖靈杯-G-爬樓梯【DP】
阿新 • • 發佈:2019-01-01
問題 G: 爬樓梯
時間限制: 1 Sec 記憶體限制: 128 MB提交: 161 解決: 57
[提交][狀態][討論版]
題目描述
由於第m個臺階上有好吃的薯條,所以薯片現在要爬一段m階的樓梯.
薯片每步最多能爬k個階梯,但是每到了第i個臺階,薯片身上的糖果都會掉落ai個,現在問你薯片至少得掉多少糖果才能得到薯條?
輸入
多組資料輸入,每組資料第一行輸入兩個數字m(1<m<=1000),k(1<=k<m),接下來有m行,每一行輸入ai(0<ai<=1000),表示第i個臺階會掉落的糖果.
輸出
對於每組資料,輸出至少要犧牲的糖果數.
樣例輸入
5 2
1 2 3 4 5
6 2
6 5 4 3 2 1
樣例輸出
9
9
提示
開始的時候薯片站在第0個臺階
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; int n,k; int cost[1010]; int dp[1010]; // 表示到達第 i個臺階時最小花費 int main() { while(~scanf("%d%d",&n,&k)) { for(int i=1;i<=n;i++) { scanf("%d",&cost[i]); dp[i]=INF; } dp[0]=cost[0]=0; for(int i=1;i<=n;i++) { int j=(i-k<0)?0:(i-k); // 這裡是因為薯片最多上 k個臺階 for(;j<i;j++) // 薯片的能力範圍,(剛好迴圈 k次) 找到到達第 i級臺階前最為合適的落腳點 dp[i]=min(dp[i],dp[j]); // 列舉在薯片能力範圍內的能夠做到的花費,找到最小花費 dp[i]+=cost[i]; // 這裡累加是因為,之前薯片還沒有跨上第 i級臺階 } printf("%d\n",dp[n]); } return 0; }