la solución del problema principal P4933

la sincronización RDCC

vínculo del título original

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:

\ [A_X, a_ {x + y} \ cdots a_ {x + ky} \]

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:

\ [F_ {i, a_i - a_k} = f_ {k, a_i - a_k} + 1 \]

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;
}

Supongo que te gusta

Origin www.cnblogs.com/bifanwen/p/12644203.html
Recomendado
Clasificación