为什么先将所有点加入map不对
查看原帖
为什么先将所有点加入map不对
746943
xijiu楼主2023/10/26 22:52
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
//f[i]=f[i]
int red(){
	int f=1,x=0;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	} 
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return f*x;
}
int gcd(int a,int b){
	if(b==0)return a;
	return gcd(b,a%b);
}
int n;
const int maxn=310,maxc=1e5+10;
struct node{
	int l,c;
};
node a[maxn];
int f[maxn*maxc];
map<int ,int >mp; 
int ans=0;
int main(){
	n=red();
	for(int i=1;i<=n;i++){
		a[i].l=red();
	}
	for(int i=1;i<=n;i++){
		a[i].c=red();
	}
//	for(int i=1;i<=n;i++)mp[a[i].l]=a[i].c;
	for(int i=1;i<=n;i++){
		for(auto it=mp.begin(); it != mp.end(); ++it) {
			if(mp[gcd(it->first,a[i].l)]==0)
			mp[gcd(it->first,a[i].l)]=1e9+10;
			//cout<<it->first<<endl; 
			mp[gcd(it->first,a[i].l)]=min(mp[gcd(it->first,a[i].l)],it->second+a[i].c);
		}
		if(mp[a[i].l]==0)mp[a[i].l]=a[i].c;
		else mp[a[i].l]=min(mp[a[i].l],a[i].c);
	}

	if(mp.find(1) == mp.end()){
		 puts("-1");
		 return 0;
	}
	printf("%d",mp[1]);
	return 0;
}

为什么边加入边进行dp对,先把所有卡片加入不对(注释部分)求解析

2023/10/26 22:52
加载中...