bzoj 1978(dp)

来源:互联网 发布:电脑印章的软件 编辑:程序博客网 时间:2024/06/06 04:49

传送门

题解:

对于每个数x枚举因子i,记录上一个能整除i的位置,从这个位置转移过来,取max即可。

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int n,L,dp[50004],nxt[1000004],ans=0;inline int read() {int x=0;char c=getchar();while (c<'0'||c>'9') c=getchar();while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();return x;}int main() {n=read(),L=read();for (register int i=1;i<=n;++i) {int x=read();for (int j=1;j*j<=x;++j) {if (x%j) continue;if (j>=L) dp[i]=max(dp[i],dp[nxt[j]]+1),nxt[j]=i;int k=x/j;if (k>=L&&j^k) dp[i]=max(dp[i],dp[nxt[k]]+1),nxt[k]=i;}ans=max(ans,dp[i]);}printf("%d\n",ans);return 0;}


原创粉丝点击