Exemplo n.º 1
0
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();
         }
     }
 }