原题链接:Problem - 1350B - Codeforces
题意:
求一个下标单调递增且互为倍数,即满足j > i且j为i的倍数,并且s[i] < s[j]的最长子序列。其实和最长上升子序列很像,只是这个是要枚举能整除i的数然后状态转移:
状态转移方程: f[j] = max(f[j], f[i] + 1);
#includeusing namespace std; #define INF 0x3f3f3f3f typedef pair PII; const double pi = acos(-1.0); #define rep(i, n) for (int i = 1; i <= (n); ++i) #define rrep(i, n) for (int i = n; i >= (1); --i) typedef long long ll; #define sqar(x) ((x)*(x)) const int N = 1e5 + 10; int a[N]; int f[N]; //每个下标下能取到最大的model int main(){ int t, n; scanf("%d", &t); while(t--){ scanf("%d", &n); rep(i, n)scanf("%d", &a[i]); rep(i, n) f[i] = 1;//题目说了每一个单独的数也算是一个符合的子序列,且长度为1 rep(i, n) for(int j = i + i; j <= n; j += i) if(a[i] < a[j]) f[j] = max(f[j], f[i] + 1); int res = 1; rep(i, n) res = max(f[i], res); printf("%dn", res); } return 0; }



