座標 \(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;
}