首页 > 其他 > 详细

CodeForces -1475G Strange Beauty 数论 动态规划

时间:2021-02-05 23:22:35      阅读:43      评论:0      收藏:0      [点我收藏+]

CodeForces -1475G Strange Beauty 数论 动态规划

题意

给定一个长度为\(n\)的序列,要求移除最少的元素元素使得对于任意\(i,j\)\(a_i\)\(a_j\)的倍数或者\(a_j\)\(a_i\)的倍数

\[1\leq n \leq 2\times 10^5\1\leq a_i \leq 2\times 10^5 \]

分析

其实就是数论吧 很容易想到正解应该是\(O(nlogn)\)的,怎么做呢?令\(dp[i]\)表示最大的数字为\(i\)的最大符合要求的集合大小,那么\(dp[i] = cnt[i] + max\{dp[j]\},i \equiv 0(mod j)\)

最后找到\(dp[i]\)的最大值,减一减就好了

代码

int dp[maxn];
int cnt[maxn];

void solve(){
	int n = rd();
	for(int i = 0;i < maxn;i++)
		dp[i] = cnt[i] = 0;
	for(int i = 0;i < n;i++)
		cnt[rd()]++;
	for(int i = 1;i < maxn;i++){
		dp[i] += cnt[i];
		for(int j = i + i;j < maxn;j += i)
			dp[j] = max(dp[j],dp[i]);
	}
	cout << (n - *max_element(dp,dp + maxn)) << ‘\n‘;
} 

int main(){
	int T = rd();
	while(T--)
		solve();
}

CodeForces -1475G Strange Beauty 数论 动态规划

原文:https://www.cnblogs.com/hznumqf/p/14379876.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!