序列中的最多除数问题(解题思路同样适用于最大递增序列)

题目描述:

       Given a set of distinct positive integers, find the largest subset such that every pair ( Si,Sj)
of elements in this subset satisfies:Si%Sj = 0 or Sj%Si = 0.

解题思想:

    首先将所有的数从小到大进行排序,得到数组num[0…length-1],其中num[0]=min<…<num[length-1]=max;

定义一个数组dp_num[0…length-1]用于储存到当前的数num[i]时,以num[i]作为最大数的子集合所包含的的元素的最多个数。初始化数组元素为1(刚开始只包含自己)

定义一个数组pre_pos[0…length-1],用于标记使num[i]%num[j]==0,0<j<i的最大j。初始化所有的数组元素为-1(因为刚开始所有的元素并没有前导)

DP: dp_num[i]=max{num[i],num[j]+1},0<j<i,pre_pos[i]=j;

Pseudo-code:

   获得已从小到大排序好的num[0…length-1];

//初始化数组元素

for(i=0;i<length-1;i++)

{dp[i]=1;

pre_pos[i]=-1;

}

//主要dp思想

for(i=1;i<length;i++)

for(j=0;j<i;j++)//因为num[i]在初始化时已经算到了自己,因此不用再次计算

{

If(num[i]%num[j]==0&&dp_num[i]<dp_num[j]+1)//此处1即为自己所占一份

{

dp_num[i]=dp_num[j]+1;//重新赋值,得到新的更大的dp_num[i]

pre_pos[i]=j;//并将j作为新的前导;

}

}

//找到最大的dp_num[i]值,并标记位置;

Max=1;

for(k=0;k<length;k++)

{

if(dp_num[k]>Max)

{ Max=dp_num[k];

signal=k; }

}

//由最大元素值前向推导得到所有元素值

printf(num[signal]);

i=pre_pos[signal];

While(i>-1){

printf(num[i]);

i=pre_pos[i];

}

Prove the correctness of your algorithm:

  主要使用样例进行正确性的分析:

  如有样例                          1    2    4    8    9    72

  则有到当前数值时的最大数对数量为  1    2    3    4    1     5

The complexity of your algorithm:

    数组排序需要时间复杂度o(nlgn),主旨算法需要时间复杂度o(n^2),因此时间复杂度为o(n^2)


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值