1. 程式人生 > >東秦第四屆圖靈杯-G-爬樓梯【DP】

東秦第四屆圖靈杯-G-爬樓梯【DP】

問題 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;
}