1 条题解
-
0
要凑出所有格子,肯定要凑出1。如果凑出1,所有格子都能凑出······
如果某几个的gcd是1,那么这些跳跃卡能凑出1。
即找一个跳跃卡集合,他们的gcd是1,并且最小。 n只有300,可以随便乱搞..
表示凑出这个gcd所用的最小花费。(状态转移见代码)
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; }
信息
- ID
- 222
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 3
- 上传者