void init(int n){ for(int i=ccal+1;i<=n;i++){ //dp[i][0] = dp[i-1][0]+2.0*dp[i-2][0]; dp[i][0] = (dp[i-1][0]+dp[i-2][0])/2.0; // dp[i][i-1] = dp[i][0];//(dp[i-1][0]+dp[i-2][0])/2.0; // printf("%lf ",dp[i][0]); int maxj=(i-1)/2; for(int j=1;j<=maxj;j++){ // if(j<=(i-1)/2){ dp[i][j] = getdp(i-2,j)+2*getdp(i-2,j-1); if(j-2>=0){ dp[i][j]+=getdp(i-2,j-2); } dp[i][j]/=4.0; // dp[i][i-j-1]=dp[i][j]; // } else { // dp[i][j]=dp[i][i-j-1]; // } // printf("%lf ",dp[i][j]); } // printf("\n"); } ccal=n; }
int getdp(int x, int y) { if(x > y) return 1; if(dp[x][y] >= 0) return dp[x][y]; int &r = dp[x][y]; for(int i = x; i < y; i++) if(getdp(x, i)>0 && getdp(i+1, y)>0) return r = 1; return r = 0; }
void dfs(vector<vector<string>> &ans, vector<string> &mem, int p) { if(p == gl) { ans.push_back(mem); } for(int i = p; i < gl; i++) { if(getdp(p, i) == 2 && getdp(i+1, gl-1) > 0) { mem.push_back(gs.substr(p, i-p+1)); dfs(ans, mem, i+1); mem.pop_back(); } } }