帮忙分析一个c++试题,算法方面的。程序有了,特别是solve() 函数,理解不了,帮忙分析一下吧

问题描述如果一个数x的约数和(不包括它本身,下同)比它本身小,那么x可以变成它的约数和;如果对于某个y>x且y的约数和为x,那么x也可以变成y。例如,4可以变为3,1可以... 问题描述
如果一个数x的约数和(不包括它本身,下同)比它本身小,那么x可以变成它的约数和;如果对于某个y>x且y的约数和为x,那么x也可以变成y。例如,4可以变为3,1可以变为7。限定所有的数字变换在不超过n的正整数范围内进行,求不断进行数字变换且没有重复数字出现的最多变换步数。

输入数据
输入一个正整数n。

输出数据
输出最少需要花费的时间。

样例输入
7

样例输出
3

样例说明
一种方案为:4→3→1→7。

时间限制
各测试点1秒

内存限制
你的程序将被分配32MB的运行空间

数据范围
n<=50 000。

#include <fstream>
using namespace std;
ifstream fin("44.in") ;
ofstream fout("44.out");
long f1[50000],f2[50000];
long sum[50000];
long n;
void init()
{
for(long i=1;i<=n;i+=1)
{
long t;
t=i*2;
while(t<=n)
{
sum[t]+=i;
t+=i;

}

}
}

void solve()
{
for(int i=n;i>=1;i-=1)
{
long t=sum[i];
if(t>=i) continue;
if(f1[i]+1>f1[t])
{
f2[t]=f1[t];
f1[t]=f1[i]+1;

}
else if(f1[i]+1>f2[t])
{
f2[t]=f1[i]+1;
}

}
}
void print()
{
long max=0;

for(long i=1;i<=n;i++)
{
if(f1[i]+f2[i]>max)
{
max=f1[i]+f2[i];
}

}
fout<<max;
}

int main()
{
fin>>n;
init();
solve();
print();
}
f1 f2这两个数组是做什么的。具体怎么回事呢
展开
 我来答
zhangwen1994
2011-11-09 · TA获得超过358个赞
知道小有建树答主
回答量:153
采纳率:0%
帮助的人:173万
展开全部
首先我们知道一条可行方案必定是一条链而不可能是一个环
那么所有可进行变化的数之间连边就是一棵树,我们要求这棵树里最长链.
那么就是一个树形dp,每个点记录以他为一端的最长链和次长链。
最后枚举每个点,看经过哪个点的连最长即为答案.
f1为最长链,f2为次长链
更多追问追答
追问
if(f1[i]+1>f1[t])
{
f2[t]=f1[t];
f1[t]=f1[i]+1;
}
else if(f1[i]+1>f2[t])
{
f2[t]=f1[i]+1;
}
这一句怎么解析?
追答
t 是 i 的 父亲
if f1[i]+1>f1[t] 即是说如果用i来更新t的最长链和次长链时发现这个结果比最长链更优,就把原来的最长链赋值给次长链,最长链为新的值,否则如果新的值大于次长链,则把新的值赋给次长链
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式