久違的樹形dp
dp[l][r] 表示在l到r之間字符串形成的子樹有多少種
然后要枚舉最左樹枝所到位置 假設是 i 那么從l+1到i-1 遞歸就是最左樹枝的種類 然后乘上剩下的部分
剩下的部分i到r相當是去掉了最左樹枝的又一個子樹,遞歸就可以
代碼:
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #define ll long long using namespace std; const ll MOD= 1000000000; const int N=305; ll dp[N][N]; char s[N]; ll dfs(int l,int r) { if(dp[l][r]!=-1) return dp[l][r]; if(l>r) return (dp[l][r]=0); if(l==r) return (dp[l][r]=1); if(s[l]!=s[r]) return (dp[l][r]=0); dp[l][r]=0; for(int i=l+1;i<=r;++i) if(s[i]==s[l]) dp[l][r]=(dp[l][r]+dfs(l+1,i-1)*dfs(i,r))%MOD; return dp[l][r]; } int main() { //freopen("data.in","r",stdin); while(scanf("%s",s)!=EOF) { int n=strlen(s); memset(dp,-1,sizeof(dp)); cout<<dfs(0,n-1)<<endl; } return 0; }
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
