返回题解分享
讨论 / 题解分享/ 帖子详情

狐仙的跳跃冒险 - 题解

要凑出所有格子,肯定要凑出1。如果凑出1,所有格子都能凑出······

如果某几个$l_i$的gcd是1,那么这些跳跃卡能凑出1。

即找一个跳跃卡集合,他们的gcd是1,并且$\sum c_i $最小。
n只有300,可以随便乱搞..

$dp[gcd]$表示凑出这个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;
}
0 回复 0 转发 0 喜欢 3 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!