描述:
有n个点,点上有值a[i], 任意两点(i, j)有无向边相连当且仅当
(a[i]moda[j])==0||(a[j]moda[i])==0
问这幅图中的最大连通子图是多少。
思路
因为边是特殊要求的,所以一个连通子图的点是一成倍数关系的序列。
aa⋅m1a⋅m2a⋅m3…a⋅mk
而 0≤a[i]≤106 ,所以他的因子是少于 103 。
dp[i] 表示最大的值为i的时候可以构成的最大连通子图
dp[i]=max(dp[j]);(i modj==0)
#include <bits/stdc++.h>
using namespace std;
int n;
int a[1000000+5];
int dp[1000000+5];
int main () {
int n;
scanf ("%d", &n);
for (int i=1; i<=n; i++) {
scanf ("%d", &a[i]);
dp[a[i]] = 1;
}
int ans = 0;
for (int i=1; i<=n; i++) {
ans = max(ans, dp[a[i]]);
int s = 2;
while(a[i]*s <= a[n]) {
dp[a[i]*s] = max(dp[a[i]*s], dp[a[i]] + 1);
s++;
}
}
printf("%d\n", ans);
return 0;
}