[51NOD1524] 可除圖的最大團(組合,dp)
阿新 • • 發佈:2017-05-15
鏈接 ble spa 組合 sin ons .html color 出現的次數
題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1524
題意:略。
這個題相當於是找出現最長的整除鏈。
dp記下輸入中每個數出現的次數,枚舉1~1e6所有數,再枚舉每個數的倍數,假如出現了,直接更新dp數組。
1e6的話篩法大概要運算1e7次,放心做。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef long long LL; 5 const int maxn = 1001000; 6 int n; 7 int a, dp[maxn];8 9 inline bool scan_d(int &num) { 10 char in;bool IsN=false; 11 in=getchar(); 12 if(in==EOF) return false; 13 while(in!=‘-‘&&(in<‘0‘||in>‘9‘)) in=getchar(); 14 if(in==‘-‘){ IsN=true;num=0;} 15 else num=in-‘0‘; 16 while(in=getchar(),in>=‘0‘&&in<=‘9‘){ 17 num*=10,num+=in-‘0‘; 18 } 19 if(IsN) num=-num; 20 return true; 21 } 22 23 int main() { 24 // freopen("in", "r", stdin); 25 while(~scanf("%d", &n)) { 26 memset(dp, 0, sizeof(dp)); 27 for(int i = 1; i <= n; i++) { 28 scan_d(a); 29 dp[a]++;30 } 31 for(int i = 1; i <= 1000000; i++) { 32 if(!dp[i]) continue; 33 for(int j = 2; j * i <= 1000000; j++) { 34 if(dp[i*j]) dp[i*j] = max(dp[i*j], dp[i] + 1); 35 } 36 } 37 int ret = 0; 38 for(int i = 1; i <= 1000000; i++) ret = max(ret, dp[i]); 39 printf("%d\n", ret); 40 } 41 return 0; 42 }
[51NOD1524] 可除圖的最大團(組合,dp)