最少乘法(思维+bfs)
问题实质上是求正整数
n
n
n的最短加法链问题,即求
n
n
n的一个加法链使其长度
l
e
n
len
len达到最小,如下图所示
按层扩展生成树,数x的下一层由其与路径上的各数字相加得出,之前出现过的舍弃,因此
b
f
s
bfs
bfs即可
C o d e : Code: Code:
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define y1 yyy
typedef long long ll;
typedef unsigned long long u64;
typedef pair<string,int> PII;
const int N=2e5+10,mod=998244353;
template<class T>
void read(T &x){
x=0; char c; int sign=1;
do{ c=getchar(); if(c=='-') sign=-1;}while(!isdigit(c));
do{ x=x*10+c-'0',c=getchar();}while(isdigit(c));
x*=sign;
}
vector<int>e[N];
queue<int>q;
int n,len[N];
int main(){
read(n);
memset(len,-1,sizeof(len));
q.push(1);
len[1]=0;
while(!q.empty()){
int x=q.front();
q.pop();
e[x].push_back(x);
for(auto i:e[x]){
if(x+i<=n&&len[x+i]==-1){
len[x+i]=len[x]+1;
q.push(x+i);
e[x+i]=e[x];
}
}
}
cout<<len[n];
return 0;
}