求回文子序列个数(虽然字符串,但是DP)

因为马拉车不能求回文子序列个数,所以只能采用这个DP
此DP是不要求连续的回文子串
你要连续的回文子串个数,可以用回文自动机

#include <iostream>
using namespace std;
int dp[200][200];
 
string str;
 
int solve(){
	int l=str.length();
    for(int j=0;j<l;++j){
        dp[j][j]=1;
        for(int i=j-1;i>=0;--i){
        	if(str[i]==str[j]) dp[i][j]=dp[i+1][j]+dp[i][j-1]+1;
            else dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1];
        }
    }
    return dp[0][l-1];
}
 
int main(){
    while(cin>>str){
        cout<<solve()<<endl;
    }
    return 0;
}
posted @ 2024-04-17 23:12  涤生yang  阅读(14)  评论(0)    收藏  举报