之前一篇写了题意
这里讲另外一种做法。
大概是用 map 记录 所有的公约数状态 然后暴力更新
代码如下 很好懂
思想很简单 ,对于CF用这种写法还是可以。就是复杂度不太好计算
但是比我用dp 状压质因子 跑的时间少 这种写法 只跑了 124MS 而状压 质因子DP 却跑了468MS
代码如下
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<map>
using namespace std;
#define INFF 0x3fffffff
map<int,int>dp;
int l[310],c[310];
int gcd(int x,int y)
{
if(y==0)
return x;
return gcd(y,x%y);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
dp.clear();
int p=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&l[i]);
p=gcd(l[i],p);
}
for(int i=1;i<=n;i++)
scanf("%d",&c[i]);
if(p!=1)
{
printf("-1\n");
continue;
}
for(int i=1;i<=n;i++)
{
if(dp.find(l[i])==dp.end())
dp[l[i]]=c[i];
else
dp[l[i]]=min(dp[l[i]],c[i]);
}
int ans=INFF;
for(int i=1;i<=n;i++)
{
map<int,int>::iterator it;
for(it=dp.begin();it!=dp.end();it++)
{
int tmp=gcd(l[i],it->first);
int cost=it->second;
if(dp.find(tmp)==dp.end())
{
dp[tmp]=cost+c[i];
}
else
{
if(dp[tmp]>cost+c[i])
dp[tmp]=cost+c[i];
}
if(tmp==1)
ans=min(ans,dp[1]);
}
}
printf("%d\n",ans);
}
return 0;
}