最长因子链 - 题目 - Daimayuan Online Judge
由于要找的数字不用按顺序,所以先给所有数排个序
找最长因子链类似于找最长上升子序列,用动态规划
状态划分,以第i个数结尾的因子链的倒数第二个数可能是第一个数,第二个数,...第i-1个数
从第一个数开始枚举,以它为结尾,首先f[i]=1,自身算一个,然后再根据前一状态推出这一状态,上一个数j一旦确定,就用f[j]+1就行,然后如果a[i]%a[j]==0,说明可以作为a[i]的前一个数,然后在众多可行的f[j]+1中取最大值就行
最后遍历一下每个数,比较以每个数为结尾的因子链的个数最大值,输出最大的那个
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1010;
int a[N];
int n;
int f[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + 1 + n);
for (int i = 1; i <= n; i++) {
f[i] = 1;
for (int j = 1; j < i; j++) {
if (a[i] % a[j] == 0) f[i] =max(f[i],f[j] + 1);
}
}
int res = 0;
for (int i = 1; i <= n; i++) {
res = max(res, f[i]);
}
cout << res << endl;
return 0;
}