51nod-1524 可除图的最大团(DP)
2017-09-07 11:18
190 查看
1524 可除图的最大团
题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
对于一般的图,最大团问题是一个NP-难的问题。然而,对于一些特殊的图,最大团问题可以有比较有效的解决方案。
关于最大团问题的概念,请百度之。^_^
在一个正整数集合A上定义可除图。 A = {a1, a2, ..., an} ,图上的顶点就是集合A中的数字。两个数字 ai 和 aj (i ≠ j) 之间有一条边的条件是 ai 能够被 aj 整除,或者 aj 能够被 ai 整除.
现在给定一个正整数集A,请找出这个集合所确定的可除图的最大团。
样例解释:在这个例子中,最大团是3,可以选择 {3,6,18}。
Input
Output
Input示例
Output示例
思路:
太坑了...dp[i]表示以i为最大团中数值最小的点。所以利用可除图的性质枚举i的倍数j,dp[i] = max(dp[i], dp[j]+1).
本题数据过多得用输入挂,可是神坑点<stdio.h>里面和<cstdio>里的机制真的不一样啊!前者自带读入挂效果??可是网上找不到两者的区别= =,网上所有博文都说cstdio是从stdio.h继承过来的,但是在这题唉...可能c++和java一样实现了过多封装而导致的吧。
代码:
STL函数:
max_element(.begin(), .end());
min_element(.begin(), .end());
寻找区间内最大最小值,复杂度仍然是线性,少写点而已。
继续加油~
题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
对于一般的图,最大团问题是一个NP-难的问题。然而,对于一些特殊的图,最大团问题可以有比较有效的解决方案。
关于最大团问题的概念,请百度之。^_^
在一个正整数集合A上定义可除图。 A = {a1, a2, ..., an} ,图上的顶点就是集合A中的数字。两个数字 ai 和 aj (i ≠ j) 之间有一条边的条件是 ai 能够被 aj 整除,或者 aj 能够被 ai 整除.
现在给定一个正整数集A,请找出这个集合所确定的可除图的最大团。
样例解释:在这个例子中,最大团是3,可以选择 {3,6,18}。
Input
单组测试数据。 第一行有一个整数n (1≤n≤10^6),表示A的大小。 第二行有n个不一样的整数 a1,a2,...,an (1≤ai≤10^6),表示A中的元素。
Output
输出一个整数,表示最大团中的点数。
Input示例
样例输入1 8 3 4 6 8 10 18 21 24
Output示例
样例输出1 3
思路:
太坑了...dp[i]表示以i为最大团中数值最小的点。所以利用可除图的性质枚举i的倍数j,dp[i] = max(dp[i], dp[j]+1).
本题数据过多得用输入挂,可是神坑点<stdio.h>里面和<cstdio>里的机制真的不一样啊!前者自带读入挂效果??可是网上找不到两者的区别= =,网上所有博文都说cstdio是从stdio.h继承过来的,但是在这题唉...可能c++和java一样实现了过多封装而导致的吧。
代码:
#include <bits/stdc++.h> using namespace std; const int maxn = 1e6+5; template <class T> inline void scan_d(T &ret) { char c; ret = 0; while ((c = getchar()) < '0' || c > '9') ; while (c >= '0' && c <= '9') { ret = ret * 10 + (c - '0'), c = getchar(); } } int a[maxn]; int dp[maxn]; int main() { int n, x, y, ans = 0; scan_d(n); for(int i = 1; i <= n; ++i) scan_d(a[i]); sort(a+1, a+n+1); for(int i = n; i >= 1; --i) { dp[a[i]] = 1; for(int j = (a[i]<<1); j <= a ; j+=a[i]) dp[a[i]] = max(dp[a[i]], dp[j]+1); } printf("%d\n", *max_element(dp, dp+a +1)); return 0; }
STL函数:
max_element(.begin(), .end());
min_element(.begin(), .end());
寻找区间内最大最小值,复杂度仍然是线性,少写点而已。
继续加油~
相关文章推荐
- 51nod 1524 可除图的最大团(DP)
- 51nod 1524 可除图的最大团【dp】
- 51nod 1524 可除图的最大团 dp
- 51Nod 1062 序列中最大的数 | 简单DP
- 51Nod 1049 最大子段和(DP动态规划)
- 51nod 1051 最大子矩阵和 (dp_good)
- 【51Nod】1051 - 最大子矩阵的和(dp)
- 51Nod-1524-可除图的最大团
- 51nod 1049 最大子段和(分治 dp)
- 51nod 1053 最大M子段和 V2 (链表 对经典dp进行优化)
- 51nod 1049 1049 最大子段和 (dp)
- 51nod_1049 最大子段和(简单DP)
- 51nod 1052 最大M子段和 (区间dp)
- 51nod 1050 循环数组最大子段和(基础dp)
- 51nod 循环数组最大子段和 (dp)
- 51nod 1270 数组的最大代价 dp
- 51nod 1051 最大子矩阵和 (dp )
- 51Nod 1051 最大子矩阵和(二维最大字段和dp)
- 51nod 最大M子段和 V1,V2,V3 dp 贪心 heap(bzoj2288)
- 51nod 1270 数组的最大代价(DP)