LoginSignup
0
0

DPまとめコンテスト解説(開発中)

Last updated at Posted at 2024-04-28

DPまとめコンテスト解説(開発中)

はじめに

こんにちは、競プロ歴1年(多分)のmikan0131(AtCoder茶)です
僕のQiitaの初投稿はDPまとめコンテストの解説です

初心者の解説なので、わかりにくいかもしれないですが、ぜひ見ていってください!

A Frog1

問題

Nこの足場があります。足場には1, 2, ...., Nと番号が振られています。各i(1 <= i <= N)いついて、足場iの高さはh_iです。
最初、足場1にカエルがいます。カエルは次の行動を何回か繰り返し、足場Nまで辿り着こうとしています。
・足場iにいるとき、足場i + 1またはi + 2へジャンプする。このとき、ジャンプ先の足場をjとすると、コスト|h_i - h_j|を支払う。
カエルが足場Nに辿り着くまでに支払うコストの総和の最小値を求めてください。

制約

  • 入力はすべて整数である
  • 2 <= N <= 10^5
  • 1 <= K <= 100
  • 1 <= h_i <= 10^4

入力

N K
h_1 h_2 ... h_N

出力

カエルが支払うコストの総和の最小値を出力せよ。

解説

動的計画法の基本といえる問題です。
足場iにおいて、足場i - 2からジャンプするか、足場i - 1からジャンプするかで、コストの総和が小さいほうを採用するのを、足場3からNまで繰り返します。足場1のコストは0、足場2のコストは、足場1からジャンプするしかないため、一意に定まります。

解答

solve.cpp
#include <bits/stdc++.h>
using namespace std;

int N, h[100009], A[100009], B[100009];
int dp[100009];

int main() {
  cin >> N;
  for (int i = 1; i <= N; i++) cin >> h[i];
  for (int i = 2; i <= N; i++) {
    A[i] = abs(h[i] - h[i - 1]);
  }
  for (int i = 3; i <= N; i++) {
    B[i] = abs(h[i] - h[i - 2]);
  }
  dp[1] = 0;
  dp[2] = A[2];
  for (int i = 3; i <= N; i++) {
    dp[i] = min(dp[i - 1] + A[i], dp[i - 2] + B[i]);
  }
  cout << dp[N] << endl;
  return 0;
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0