题意:给你一个字符串,求通过删除几个字符后形成回文串的方案数。
解析:dp[i][j] = 第i个字符到第j个字符的方案数
s[i]=s[j] :dp[i][j] = dp[i+1][j]+dp[i][j-1]
s[i]!=s[j] :dp[i][j] = dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]
[code]:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
char s[100];
int n;
LL dp[100][100];
int main(){
int i,j,cas,T;
scanf("%d",&cas);
for(T = 1;T <= cas;T++){
scanf("%s",s+1);
n = strlen(s+1);
for(i = 1;i <= n;i++)for(j = 1;j <= n;j++) dp[i][j] = 1;
for(i = n;i > 0;i--){
dp[i][i] = 2;
for(j = i+1;j <= n;j++){
if(s[i]==s[j]) dp[i][j] = dp[i+1][j]+dp[i][j-1];
else dp[i][j] = dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1];
}
}
//-1 去除空串
printf("Case %d: %lld\n",T,dp[1][n]-1);
}
return 0;
}