对于旁边都比自己大的点,它肯定是1
对于旁边有比自己小的点,先算出比自己小的点的值再+1就好了。
每个点如果计算过了就记忆化,下次再计算他的时候不用重复递归直接返回。
这样复杂度就是O(N)的;
跑了466ms,比xc大佬1800+ ms的$Nlog(N)$快了很多
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 233;
typedef long long ll;
int f[maxn], a[maxn], n;
int dfs(int x)
{
if(f[x]) return f[x];
if(a[(x + n - 1) % n] >= a[x] && a[(x + 1) % n] >= a[x]) return f[x] = 1;
int v = 0;
if(a[(x + n - 1) % n] < a[x]) v = dfs((x + n - 1) % n);
if(a[(x + 1) % n] < a[x]) v = max(v, dfs((x + 1) % n));
return f[x] = v + 1;
}
int main()
{
int T; cin >> T;
while(T--)
{
scanf("%d", &n);
memset(f, 0, sizeof f);
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
for(int i = 0; i < n; i++) dfs(i);
ll ans = 0;
for(int i = 0; i < n; i++) ans += f[i];
cout << ans << endl;
}
}
还有为什么
v=0
呢,我没初始化v就错了~~··v是局部变量,不初始化的话是系统随机分配的值
赞~
(x + n - 1)
的作用是找x=0
的情况吗,头疼 为什么你们都用c写啊?算法难道不都是机器学习的学生考得吗?机器学习不都是用python吗?
我是竞赛选手。。不懂机器学习
qiang
666
赞
赞