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);
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;
}