题解 P2618 【数字工程】
feecle6418 · · 题解
既然可以DP,为什么不能记忆化搜索呢?
只需要每一次
代码如下:
#include<bits/stdc++.h>
using namespace std;
int vst[1000005],prime[1000005],s[1000005],n,ans[1000005];
int DFS(int x){
if(~ans[x])return ans[x];
ans[x]=0x3f3f3f3f;
for(int i=1;i*i<=x;i++){
if(!(x%i)){
if(!vst[i])ans[x]=min(ans[x],DFS(x/i)+1);
if(!vst[x/i])ans[x]=min(ans[x],DFS(i)+1);
}
}
ans[x]=min(ans[x],DFS(x-1)+1);
return ans[x];
}
int main(){
vst[1]=1;
for(int i=2;i<=1000000;i++){
if(vst[i])continue;
prime[++prime[0]]=i;
for(long long j=1ll*i*i;j<=1000000;j+=i)vst[j]=1;
}
memset(ans,-1,sizeof(ans));
ans[1]=0;
while(~scanf("%d",&n)){
printf("%d\n",DFS(n));
}
return 0;
}