题解分享
题解分享简介
狐仙的跳跃冒险 - 题解
要凑出所有格子,肯定要凑出1。如果凑出1,所有格子都能凑出······
如果某几个$l_i$的gcd是1,那么这些跳跃卡能凑出1。
即找一个跳跃卡集合,他们的gcd是1,并且$\sum c_i $最小。
n只有300,可以随便乱搞..
$dp[gcd]$表示凑出这个gcd所用的最小花费。(状态转移见代码)
```cpp
void solve(){
map<int,int> dp;
int n;
cin>>n;
vector<int> l(n+1);
vector<int> c(n+1);
for(int i=1;i<=n;i++) cin>>l[i];
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1;i<=n;i++){
for(auto [g,val]:dp){
int ng = __gcd(g,l[i]);
if(dp.find(ng)==dp.end()){
dp[ng] = c[i] + val;
}else{
dp[ng] = min(dp[ng],c[i]+val);
}
}
if(dp.find(l[i])== dp.end()){
dp[l[i]] = c[i];
}else{
dp[l[i]] = min(dp[l[i]],c[i]);
}
}
if(dp.find(1)==dp.end()) cout<<-1<<endl;
else cout<<dp[1]<<endl;
}
```
查看全文
0
0
0
3



