Palíndromo subsecuencia HDU-4632 intervalo dp problema palíndromo campamento de vacaciones de invierno

En matemáticas, una subsecuencia es una secuencia que puede derivarse de otra secuencia eliminando algunos elementos sin cambiar el orden de los elementos restantes. Por ejemplo, la secuencia <A, B, D> es una subsecuencia de <A, B, C, D, E, F>.
(http://en.wikipedia.org/wiki/Subsequence)

Dada una cadena S, su tarea es averiguar cuántas subsecuencias diferentes de S son palíndromos. Tenga en cuenta que para dos subsecuencias cualesquiera X = <Sx1, Sx2,…, Sxk> e Y = <Sy1, Sy2,…, Syk>, si existe un entero i (1 <= i <= k) tal que xi! = yi, las subsecuencias X e Y deben considerarse diferentes incluso si Sxi = Syi. Además, dos subsecuencias con diferente longitud deben considerarse diferentes.
Entrada
La primera línea contiene solo un entero T (T <= 50), que es el número de casos de prueba. Cada caso de prueba contiene una cadena S, la longitud de S no es mayor que 1000 y solo contiene letras minúsculas.
Salida
Para cada caso de prueba, envíe el número de caso primero, luego envíe el número de subsecuencia diferente de la cadena dada, la respuesta debe ser el módulo 10007.


A
AAAAA
goodafternooneveryone
welcometoooxxourproblems
la muestrear la salida
Caso 1: 1
Caso 2: 31 es
. Caso 3: 421
Caso 4:. 960
con dp grabación de 1 a len el número de subsecuencias palindrómicas tener, que creció intervalo para empujar el rango grande, por lo con la parte delantera y trasera Cuando aparece el mismo personaje, hay dp[j][k]=max(dp[j][k],dp[j][k-1]+dp[j+1][k]+1)%10007, porque el medio se puede combinar con el primero o el último.
Cuando es diferente antes y después, sí dp[j][k]=(dp[j][k-1]+dp[j+1][k]-dp[j+1][k-1]+10007)%10007, se puede combinar el primero con el primero + y el último. Longitud: la longitud que aparece repetidamente en el medio, aquí preste atención al módulo para agregar + mod al final, para asegurarse de que no haya módulo negativo y algunos casos especiales

#include<map>
#include<stack>
#include<queue>
#include<string>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define ls (k<<1)
#define rs (k<<1|1)
#define pb push_back
#define mid ((l+r)>>1)
using namespace std;
const int p=1e4+7;
const int mod=10007;
const int maxn=1500;
typedef long long ll;
const int inf=0x3f3f3f3f;   
int dp[maxn][maxn];
char s[maxn];
ll mode(ll a,ll b){
    
    
    ll sum=1;
    a=a;
    while(b>0){
    
    
        if(b%2==1)
            sum=(sum*a);
            b/=2;
            a=(a*a);
    }
    return sum;
}
void solve(){
    
    
    int t;
    cin>>t;
    int cnt=0;
    while(t--){
    
    
        scanf("%s",s+1);
        memset(dp,0,sizeof(dp));
        int len=strlen(s+1);
        for(int i=1;i<=len;i++)
            dp[i][i]=1;
        for(int i=1;i<=len;i++){
    
    //枚举字符串长度
            for(int j=1;j+i<=len+1;j++){
    
    //枚举端点
                int k=i+j-1;//
                if(s[j]==s[k])
                    dp[j][k]=max(dp[j][k],dp[j][k-1]+dp[j+1][k]+1)%10007;
                else
                    dp[j][k]=(dp[j][k-1]+dp[j+1][k]-dp[j+1][k-1]+10007)%10007;
            }   
        }
        printf("Case %d: %d\n",++cnt,dp[1][len]);
    }
}
int main(){
    
    
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    solve();
    system("pause");    
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_45891413/article/details/112741291
Recomendado
Clasificación