Codeforces Round #641 (Div. 2)的其他题解点我
B. Orac and Models
题目大意:
给出一个序列,从中选出一些数,选出后的序列,满足左边值的下标要能整除右边值的下标(左边值的下标 < 右边值的下标)(在原序列的下标),并且左边的值 < 右边的值。给出n个数,要求求出满足条件的最长的序列的长度。
思路:
一道挺简单的DP,别看错题就好QWQ
AC代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
const int maxn = 2e5 + 3;
int aa[maxn];
map<int, int > map1;
int dp[maxn];
int main() {
int T;
scanf("%d", &T);
while (T--) {
map1.clear();
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &aa[i]);
dp[i] = 1;
}
for (int i = 2; i <= n; i++) {
for (int j = 1; j * j <= i; j++) {
if (i % j) continue;
if (aa[i] > aa[j]) dp[i] = max(dp[i], dp[j] + 1);
if (i / j != j && aa[i / j] < aa[i]) dp[i] = max(dp[i], dp[i / j] + 1);
}
}
int ans = 0;
for (int i = 1; i <= n; i++) {
ans = max(ans, dp[i]);
}
printf("%d\n",ans);
}
}