B. Orac and Models-------------------------思维(dp)

B. Orac and Models-------------------------思维(dp)_第1张图片
B. Orac and Models-------------------------思维(dp)_第2张图片
解析:
和最长上升子序列是一样的。是不过我们要枚举能整除i的数然后状态转移

状态转移方程:f[i]=max(f[j],f[i]+1)

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1000;
int f[N];
int a[N];
int q[N];
int tot,n;
int main()
{
	scanf("%d",&tot);
	while(tot--)
	{
		scanf("%d",&n);   
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		for(int i=1;i<=n;i++) f[i]=1;
		for(int i=1;i<=n;i++)
		{
			for(int j=2*i;j<=n;j+=i) 
			{
				if(a[j]>a[i]) f[j]=max(f[j],f[i]+1);
			}
		}
		int res=0;
		for(int i=1;i<=n;i++) res=max(res,f[i]);
		cout<<res<<endl;
	}
}

你可能感兴趣的:(思维,Codeforces)