题目描述:
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)