欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

B.OracandModels(cf)dp

时间:2023-04-28

原题链接: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 0x3f3f3f3ftypedef 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]; //每个下标下能取到最大的modelint 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;}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。