Codeforces512 B. Fox And Jumping(dp,map优化、离散化节点)

题意:

有n张卡片,第i张卡片上的数值为a(i)

数据范围:n<=300,a(i)<=1e9,c(i)<=1e5

解法:

题目可以转化为:
给定n个不相同的数,取第i个数的代价为c[i],
要求取出若干个数,满足这些数的gcd为1,输出最小代价

d[k]表示gcd为k的最小代价,转移方程:
d[gcd(k,a[i])]=min(d[gcd(k,a[i])],d[k]+c[i])

因为gcd非连续,所以用map离散化

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=305;
int a[maxm];
int c[maxm];
int n;
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>c[i];
    map<int,int>d;
    for(int i=1;i<=n;i++){
        for(auto it=d.begin();it!=d.end();it++){
            int g=__gcd(it->first,a[i]);
            if(!d.count(g))d[g]=it->second+c[i];
            else d[g]=min(d[g],it->second+c[i]);
        }
        if(!d.count(a[i]))d[a[i]]=c[i];
        else d[a[i]]=min(d[a[i]],c[i]);
    }
    if(!d.count(1))cout<<-1<<endl;
    else cout<<d[1]<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/107755239
Fox
今日推荐