码迷,mamicode.com
首页 > 其他好文 > 详细

[51NOD1524] 可除图的最大团(组合,dp)

时间:2017-05-15 22:22:44      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:line   tps   www   最大团   har   ++   question   scanf   更新   

题目链接: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)

标签:line   tps   www   最大团   har   ++   question   scanf   更新   

原文地址:http://www.cnblogs.com/kirai/p/6858457.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!