제출 #1362539

#제출 시각아이디문제언어결과실행 시간메모리
1362539AvianshSequence (BOI23_sequence)C++20
100 / 100
1695 ms93056 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
const int mxn = 30005;
const int inf = 1e18;
map<set<int>,int>mem;
vector<int>fac[mxn];

void pre(){
    for(int i = 2;i<mxn;i++){
        for(int j = i+i;j<mxn;j+=i){
            fac[j].push_back(i);
        }
    }
}

int w[mxn+1];

int minCost(set<int>req){
    if(mem.find(req)!=mem.end()){
        return mem[req];
    }
    if(req.size()==1){
        if((*req.begin())==1){
            //base case
            return mem[req]=w[1];
        }
    }
    //break biggest element
    int ans = inf;
    int lar = (*(--req.end()));
    for(int j : fac[lar]){
        int a = j;
        int b = lar/j;
        set<int>ne;
        for(int z : req){
            ne.insert(z);
        }
        ne.erase(lar);
        ne.insert(a);
        ne.insert(b);
        ans=min(ans,minCost(ne)+w[lar]);
    }
    set<int>ne;
    for(int i : req){
        ne.insert(i);
    }
    ne.erase(lar);
    ne.insert(lar-1);
    ans=min(ans,min(ans,minCost(ne)+w[lar]));
    return mem[req]=ans;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    pre();
    int n;
    cin >> n;
    for(int i = 1;i<=n;i++){
        cin >> w[i];
    }
    for(int i = 1;i<=n;i++){
        cout << minCost({i}) << "\n";
    }
    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…