private static String[] dynProg(final String[] punctuation, final String[] words, final int NGramLength) {
        double[][][] matrix = new double[words.length][punctuation.length][2];

        /*
        Init
         */
        String[][] temp = fakeHyperFSA(words, 0, NGramLength);
        for(int i = 0; i < matrix[0].length; i++) {
            double NGramScore = fakeNGramValue(temp[i]);
            matrix[0][i][0] = NGramScore;
            matrix[0][i][1] = -1; //-1 will be used to stop the backtrack.
        }

        /*
        Calculating matrix ...
         */
        for(int i = 1; i < matrix.length-NGramLength; i++) {
            String[][] NGrams = fakeHyperFSA(words, i, NGramLength);
            for(int j = 0; j < matrix[i].length; j++) {


                for(int k = 0; k < NGramLength; k++) {
                    double NGramScore = fakeNGramValue(NGrams[k]);


                }
            }
        }

        /*
        Decode step
         */
        return null;
    }