El pensamiento lineal dp + 60 C ox-off práctica aspectos operativos partido de título

Destacados operativos

título Descripción

Hay un movimiento lejos de la operación de 26 tipos, cada operación utilizamos a, b, c, d, ..., x, y, z en lugar de símbolos.
Ahora hay una secuencia de operación de carne de longitud n, que puede ahora desde el interior a cabo ciertas operaciones para combinar en una operación de vídeo, por ejemplo, la secuencia de funcionamiento es ABCDABCD, a continuación, el funcionamiento del vídeo tendrá a, b, c, d, ab, ac, ad , etc. (es decir, la operación de la sub-secuencia). se preguntó longitud k y la diferente naturaleza de la operación de vídeo cuántos.
por ejemplo, para ABAB, 2 de diferente longitud y la naturaleza de los resultados tienen AB, AA, BA, BB.
Teniendo en cuenta la respuesta puede ser muy grande, sólo tiene que la producción en 1e9 + 7 importancia mueren responder a ella.

Introduzca una descripción:

La primera línea de dos números enteros n, K.
La segunda línea de una cadena de longitud n, para asegurar la presencia de letras minúsculas.

Descripción Salida:

Se indica la longitud de una línea es el número de número entero k y la diferente naturaleza de la operación del vídeo.


Orar secuencia de números, DP obvio para su uso, y al parecer se lanzó ecuación DP:

dp [i] [j] = dp [i-1] [j-1] + dp [i-1] [j];

El problema es que no es repetitivo, cómo volver a hacer?

Puede grabar la posición de la última aparición de cada letra, y esta ecuación es el prefijo similares, por lo que un valor final de la posición aparece restando las letras actuales antes de la línea;

dp [i] [j] - = dp [pre [s [i] - 'A'] - 1] [j-1];

Se hace notar aquí de longitud cero;

código:

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100010;
const int M=2000100;
const LL mod=1e9+7;
LL dp[1100][1100];
char s[1100];
int pre[30];
int main(){
	int n,k;
	cin>>n>>k;
	scanf("%s",s+1);
	dp[0][0]=1;
	for(int i=1;i<=n;i++){//位置 
		for(int j=0;j<=i;j++){//长度 
			dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
			if(pre[s[i]-'a']) dp[i][j]-=dp[pre[s[i]-'a']-1][j-1];
			dp[i][j]%=mod;
		}
		pre[s[i]-'a']=i;
	}
	if(k==0){
		cout<<1<<endl;
		return 0;
	}
	if(dp[n][k]<0) dp[n][k]+=mod;
	cout<<dp[n][k]<<endl;
	return 0;
}
Publicados 264 artículos originales · alabanza won 46 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/qq_44291254/article/details/105161258
Recomendado
Clasificación