競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 288E

ABC288E

Key:
買うときの値段を決めているのは何か.

買う順序によって値段は変わる. しかし,よく見ると,今買うか決めようとしている商品の値段は, 既に何個買ったか だけに依存している. 買う順序や,どれを買ったかの集合には依存しない.

実装:
あまり綺麗な構造にはならなそうなので全探索. つまりDP.

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

int main() {
  ll n, m ;
  cin >> n >> m;
  vll a(n); rep(i,n) { cin >> a[i]; }
  vll c(n); cinv(c);
  vector<bool> must(n);
  rep(i,m){
    ll x; cin >> x;
    --x;
    must[x] = true;
  }

  vvll mc(n, vll(n+1, INFL)); // min c[l,r)
  rep(l,n) srep(r,l,n){ // rem : r < n
    mc[l][r+1] = min(mc[l][r], c[r]);
  }


  vll dp(n+1, INFL);
  dp[0] = 0;
  rep(i,n){
    vll old(n+1, INFL);
    swap(dp, old);

    rep(j,i+1){
      chmin(dp[j+1], old[j] + mc[i+1-(j+1)][i+1] + a[i]);
      if(!must[i]) chmin(dp[j], old[j]);
    }
  }
  cout << *min_element(all(dp)) << endl;

 
  return 0;
}