Brevemente significado de las preguntas:
¿Cuántas sucesión aritmética tiene un número de columnas de la demanda. (Secuencia no es necesariamente continuo , subcadena obligada continuamente )
Nota: La tolerancia puede ser negativo.
Un algoritmo
Para \ (30 \% \) de datos, \ (n- \ Leq 20 es \) .
Obviamente, se enumeran las secuencias, y luego verificar la violencia.
complejidad del tiempo: \ (O (n ^ 2-\ n-Times) \) .
Puntuación real: \ \ (30pts) .
algoritmos de dos
Para \ (60 \% \) de datos, \ (n- \ Leq 100 \) , \ (V \ Leq 2 \ ^ 10. 3 Tiempos \) .
Antes de secuencia aritmética enumeración \ (2 \) clave y, a continuación, calcular la tolerancia, la siguiente enumeración puede ser.
complejidad del tiempo: \ (O (n ^ 3) \.) .
Resultado real: \ (60pts) \ ~ \ (100 pts) \ (constante depende de la aplicación).
Algoritmo para tres
Para adicionales \ (20 \% \) de datos, toda la configuración eléctrica de una altura de la secuencia aritmética columna.
Obviamente, en este caso la respuesta es equivalente a \ (. 1 \) ~ \ (n \) buscar la progresión aritmética.
¿Por qué? En este caso, siempre que la secuencia aritmética realiza \ (x, x + cdots Y, X + Y \ X + KY \) , entonces el número original de columnas correspondientes al número de la lista:
Número de columnas es necesariamente aritmética, y cada columna corresponde a un número de tales secuencia aritmética .
A continuación, se utiliza el anterior (60 \% \) \ violencia optimizarlo, enumerar dos puntos cualesquiera pueden formar secuencias aritméticas, se puede calcular.
Por supuesto, no es un caso especial: es decir, \ (a_i = A_j (i \ no = j) \) , las secuencias arbitrarias pueden formar la respuesta, la respuesta es \ (2-n- ^ 1 \.) .
Además frontal \ (60 \% \) la violencia:
complejidad del tiempo: \ (O (n ^ 3) \.) .
Puntuación real: \ (80pts) \ ~ \ (100 pts) \ (programa todavía depende de una constante).
Cuatro óptima
Considere \ (\ DP {texto} \) .
Con \ (f_ {i, j} \) representa, a \ (I \) al final de la tolerancia \ (J \) número aritmética de columnas.
Por supuesto, no tenemos para enumerar \ (J \) , enumeramos \ (k <i \) una \ (k \) , y dejamos \ (j = a_i - a_k \ ) transferido.
Así (sin tener en cuenta el problema subíndice negativo) ecuación de transición de estado es:
Claramente, con un frente de las mismas tolerancias número transferido columnas.
Finalmente, recuerde longitud \ (1 \) , \ (2 \) de la secuencia aritmética plus.
Manejar subíndice negativo, todos los índices (segunda dimensión) más \ (N \) , puede abrir una gran variedad.
complejidad del tiempo: \ (O (n ^ 2) \) .
Puntuación real: \ (100 pts) \ .
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int MOD=998244353;
const int N=1e3+1;
const int M=4e4+1;
inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
int n,a[N],ans=0;
int f[N][M];
int main(){
n=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=n;i++) {
ans=(ans+i)%MOD; //长度为 1 , 2 的数列
for(int j=i-1,t;j>=1;j--) {
t=a[i]-a[j]; //公差
ans=(ans+f[j][t+N])%MOD; //记录答案
f[i][t+N]=(f[i][t+N]+f[j][t+N]+1)%MOD; //转移
}
} printf("%d\n",ans);
return 0;
}