树形dp(数字转换NOIP17提高模拟训练4)
来源:互联网 发布:导航仪端口查询工具 编辑:程序博客网 时间:2024/06/05 20:47
如果一个数x的约数和(不包括它本身,下同)比它本身小,那么x可以变成它的约数和;如果对于某个y>x且y的约数和为x,那么x也可以变成y。例如,4可以变为3,1可以变为7。限定所有的数字变换在不超过n的正整数范围内进行,求不断进行数字变换且没有重复数字出现的最多变换步数。
输入一个正整数n。
输出最少需要花费的时间。
样例输入:
7
样例输出:
3
这是网上抄来的解析:如果x和y可以互相转化,就连接一条无向边,最后得到的图其实是一个森林,每棵树都是无根树,其实就是要求,整个森林中两个连通的点的最远距离(这里边权都是1),和在无根树中求两点最远距离是一样的,不过这题的特殊性,可以更方便点对于任意一条边,必有x<y,在树中,x就应该为y的双亲(因为y的约数和是唯一的,但x可能是很多个数的约数和,这正好对应树的关系,双亲唯一,孩子不定)。而dp思想照样是找出每个节点到叶子的最大值m1和次大值m2,再两者相加的dp[rt],而整个树中的最大值,就是扫描全部节点,找到最大的dp[rt]由于这题,每个节点的双亲是可以记录下来的,所以dp的时候不用递归,而写成递推式,直接从叶往上递推,为什么不能从根往下递推呢,这很容易理解,想想我们是怎么计算m1和m2的还有一个重要的时候就是怎么找出约数和,数据比较大,应该尽量避免多余的判断,用筛法求约数和则是一个不错的方法
这是我的代码:
#include<bits/stdc++.h>#define maxn 102930using namespace std;int n;long long sum[maxn],m1[maxn],m2[maxn];void solve(){for(int i=n;i>=1;i--){if(sum[i]<i)//判断是否符合条件,注意审题。{if(m1[i]+1>m1[sum[i]]){m2[sum[i]]=m1[sum[i]];m1[sum[i]]=m1[i]+1;}else if(m1[i]+1>m2[sum[i]])m2[sum[i]]=m1[i]+1;} }long long ans=0;for(int i=1;i<=n;i++)ans=max(m1[i]+m2[i],ans);cout<<ans<<endl;}int main(){ cin>>n; for(int i=1;i<=n;i++) sum[i]=1; for(int i=2;i<=n/2;i++)for(int j=2*i;j<=n;j+=i)//求约数和 sum[j]+=i;solve(); return 0;}
阅读全文
0 0
- 树形dp(数字转换NOIP17提高模拟训练4)
- 树形dp(人品问题NOIP17提高模拟训练3)
- 数列(NOIP17提高模拟训练11)
- 模拟 (NOIP17提高模拟训练11六边形)
- 记忆化搜索(游戏NOIP17提高模拟训练11)
- 立体井字棋NOIP17提高模拟训练5
- 所有的M数NOIP17提高模拟训练5
- SSL2541 2016提高组模拟试题 敌敌(树形dp)
- 算法训练 结点选择 (树形DP)
- 树形dp专题训练
- 树形DP 专题训练
- (noip 模拟 染色)<树形DP>
- 蓝桥杯 - 算法训练 - ALGO - 4 结点选择 (经典树形DP)
- 算法训练 结点选择 (树形dp)(点权)
- 算法训练 结点选择 (无向边树形DP)
- 提高组 模拟题训练
- hdu4003&&蓝桥杯, 算法提高 金属采集 (树形DP,经典。。。)
- 蓝桥杯 算法提高 结点选择(树形DP)
- 树形dp(人品问题NOIP17提高模拟训练3)
- 使用SSH框架进行开发的时候,由于延迟加载引起的no Session错误解决方法
- 立体井字棋NOIP17提高模拟训练5
- 所有的M数NOIP17提高模拟训练5
- 前端初学学习进程II
- 树形dp(数字转换NOIP17提高模拟训练4)
- 前缀和(vijos1090连续数之和)
- Treap基础模板题
- 模拟(玩具谜题NOIP 2016 提高组 Day 1 第一题vijos2003)
- 简易通讯录
- 二分查找(隐形的翅膀vijos1237)
- 51nod 1264 线段相交
- SSM框架mybatis-generates遇到的json解析问题
- 三分法(洛谷3382 【模板】三分法)