Largest Divisible Subset

这道题挺有意思的,就是给定一个序列的整数,然后让找出最大的子集,这子集中的任何两个元素能够互相整除(i%j==0或者j%i==0).

思路

子集中两个元素能够保证能够整除,那么如果再加入一个整数,判断的条件就是这个整数能够整除子集中最小的数或在能够被其中最大的数整除,当然,这个说法仅仅是针对题目解答的一个途径。

我们将序列排序,然后使用动态规划来求解,如何使用动态规划呢,设
T[n]为第n个整数为最大时,得到的最大子集的长度。

vector<int> getSubSet(vector<int>& nums){
vector<int> res;
    int n=num.size();
    int m=INT_MIN,mi=0;
    sort(num.begin(),num.end());
    vector<int> Ten(n,0);
    vector<int> index(n,0);
    for(int i=n-1;i>=0;--i){

        for(int j=i;j<n;++j){
            if(num[j]%num[i]==0&&Ten[i]<1+Ten[j]){
                Ten[i]=1+Ten[j];
                index[i]=j;
                if(Ten[i]>m){
                    m=Ten[i];
                    mi=i;
                }
            }
        }
    }

    for(int i=0;i<m;++i){
        res.push_back(num[mi]);
        cout<<num[mi]<<" ";
        mi=index[mi];
    }
    cout<<endl;
    return res;
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值