Exploring Pyramids UVA - 1362

#include<bits/stdc++.h>
using namespace std;

#define rep(i,a,b) for(int i=a;i<b;i++)
typedef long long ll;
bool is_prime(int x){if(x<2)return false;int m=sqrt(x+0.5);rep(i,2,m+1)if(x%i==0)return false;return true;}

const int maxn=300+10;
const int mod=1e9;

char s[maxn];

int d[maxn][maxn];

int dp(int i,int j){
    if(i==j)return 1;
    if(s[i]!=s[j])return 0;
    int &ans=d[i][j];
    if(ans>=0)return d[i][j];
    ans=0;
    for(int k=i+2;k<=j;k++){
        if(s[i]!=s[k])continue;
        ans=(ans+(ll)dp(i+1,k-1)*(ll)dp(k,j))%mod;
    }
    return ans;
}

/*
ABABABA
AB
枚举起点和终点,在枚举中点
*/
int main(){
    while(scanf("%s",s)==1){
        memset(d,-1,sizeof(d));
        printf("%d\n",dp(0,strlen(s)-1));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36424540/article/details/81609985