比较难的区间dp题
#include<bits/stdc++.h>
using namespace std;
long long dp[60][60];
int mm = 1e9 + 7;
int main()
{
int T , n ;
string s;
cin >> T;
while(T --)
{
cin >> n;
cin >> s;
memset(dp,0,sizeof(dp));
for(int i = n - 1 ; i >= 0; i--)
{
for(int j = i ; j < n ; j ++)
{
dp[i][j] = (dp[i + 1][j] + dp[i][ j - 1 ] - dp[i + 1][j - 1]) % mm;
if( s[i] == s[j])
//dp[i][j] += (dp[i + 1][j - 1] + 1) % mm;
dp[i][j] = (dp[i][j] + dp[i + 1][j - 1] + 1) % mm;
}
}
dp[0][n-1] %= mm;
cout << dp[0][n-1] << endl;
}
return 0;
}