競技プログラミング日記

主に AtCoder の記事です

第三回 アルゴリズム実技検定 H問題

 

PAST003H

座標 \(i\) にいるとき,次に取るべき行動は, 今までの行動とは無関係に選べる. つまり,時刻だけが重要で今までの選択は無関係なので, 状態をまとめることができ,これはDPで実現可能.

実装
ジャンプ中にゴールするときだけ注意. 問題文にも書いてあるし, \(T_{j}\) たちが全て偶数という制約もある.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"


int main() {
  ll n, l;
  cin >> n >> l;
  set<ll> x;
  rep(i,n) {
    ll a ; cin >> a;
    x.insert(a);
  }
  vll t(3);
  cinv(t);

  vll dp(l+20, INFL);
  dp[0] = 0;
  rep(i,l+10){
    ll a = (in(i,x) ? t[2] : 0);
   
    chmin(dp[i+1], dp[i] + t[0] + a);
    chmin(dp[i+2], dp[i] + t[0] + t[1] + a);
    chmin(dp[i+4], dp[i] + t[0] + 3*t[1] + a);

    if(in(l,i+1, i+4)){
      chmin(dp[l], dp[i] + t[0]/2 + (2*l-2*i-1)*t[1]/2 + a);
    }

  }
  cout << dp[l] << endl;

  return 0;
}