mini notes

競技プログラミングの解法メモを残していきます。

DPまとめコンテスト  B - Frog 2

B - Frog 2

概要

数列h_{N}がある。この数列を0とばし、1とばし、… 、Kとばしのいずれかで進む。
h_{i}からh_{j}に進むとき、コストが|h_{j}-h_{i}|かかる。
h_{1}からh_{N}に進むときのコストの総和の最小値を求めよ。

制約

2 \leq N \leq 10^{5}
1 \leq K \leq 100
1 \leq h_{i} \leq 10^{4}

方針

A問題同様、コストを配列にする。
A問題は1個前からの移動、2個前からの移動とのminをとっていたが、
この問題では1個前からの移動、2個前からの移動、… 、K個前からの移動とのminをとればよい。

解答

Submission #3939065 - Educational DP Contest / DP まとめコンテスト

#include <bits/stdc++.h>
 
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define rep(i,n) FOR(i,0,n)
#define RFOR(i,a,b) for(int i=(a)-1;i>=(b);i--)
#define rrep(i,n) RFOR(i,n,0)
 
using namespace std;
 
typedef long long ll;
typedef unsigned long long ull;
 
int main()
{
	cin.tie(0);
	ios::sync_with_stdio(false);
 
	int n, k;
	cin >> n >> k;
 
	ll h[n];
	rep(i, n) cin >> h[i];
 
	ll INF = 1e13;
	ll c[n];
	rep(i, n) c[i] = INF;
	c[0] = 0;
 
	for(int i = 1; i < n; i++){
		for(int j = max(i-k, 0); j < i; j++){
			c[i] = min(c[i], c[j] + abs(h[j] - h[i]));
		}
	}
 
	cout << c[n-1] << endl;
}