博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LOJ10155数字转换
阅读量:5156 次
发布时间:2019-06-13

本文共 1537 字,大约阅读时间需要 5 分钟。

题目描述

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

输入格式

输入一个正整数 n

输出格式

输出不断进行数字变换且不出现重复数字的最多变换步数。

样例

样例输入

7

样例输出

3

样例说明

一种方案为 4317。

数据范围与提示

对于 100% 的数据,1n50000。

 

******求树的最长链问题,先预处理每个数的约数,将可以互相转化的数之间连边,很明显这是一颗树,我们要求树的最长路径。

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 int sum[50005] = {
0},n,d1[50005],d2[50005]; 7 void ready() 8 { 9 int i,j;10 scanf("%d",&n);11 for(i = 1;i <= n;i++)12 {13 for(j = 2;j <= n / i;j++)14 {15 if(i * j > n)16 break;17 sum[i * j] += i;18 }19 }20 }21 void dp()22 {23 int i;24 for(i = n;i >= 1;i--) //因为大数字一定是小数字的后代 25 {26 if(sum[i] < i) //sum[i]是i的父亲节点 27 {28 if(d1[i] + 1 > d1[sum[i]])//修改sum[i]这点的最大值 29 {30 d2[sum[i]] = d1[sum[i]];31 d1[sum[i]] = d1[i] + 1;32 }33 else if(d1[i] + 1 >d2[sum[i]])34 {35 d2[sum[i]] = d1[i] + 1;36 }37 }38 }39 }40 int main()41 {42 int i,ans = 0;43 ready();44 dp(); 45 for(i = 1;i <= n;i++) //遍历所有的节点,找最大值+次大值的最大值 46 {47 if(d1[i] + d2[i] > ans)48 ans = d1[i] + d2[i];49 } 50 printf("%d",ans);51 return 0;52 }

 

 

转载于:https://www.cnblogs.com/rax-/p/9915067.html

你可能感兴趣的文章
LeetCode Ones and Zeroes
查看>>
基本算法概论
查看>>
jquery动态移除/增加onclick属性详解
查看>>
JavaScript---Promise
查看>>
暖暖的感动
查看>>
Java中的日期和时间
查看>>
Django基于admin的stark组件创建(一)
查看>>
PAT L2-016 愿天下有情人都是失散多年的兄妹
查看>>
抛弃IIS,利用FastCGI让Asp.net与Nginx在一起
查看>>
C. Tanya and Toys_模拟
查看>>
springboot jar包运行中获取资源文件
查看>>
基于FPGA实现的高速串行交换模块实现方法研究
查看>>
Java Scala获取所有注解的类信息
查看>>
delphi ,安装插件
查看>>
case when then的用法-leetcode交换工资
查看>>
11.28.cookie
查看>>
Java中对List集合排序的两种方法
查看>>
BeanShell简介
查看>>
python字符串操作
查看>>
MySQL学习之备份
查看>>