private JumpItem MinimumNumberofJumpsDP(int[] input)
        {
            if (input.Length == 0 || input[0] == 0)
            {
                return(null);
            }

            int[] jumps      = new int[input.Length];
            int[] jumpvalues = new int[input.Length];

            // Find the minimum number of jumps to reach arr[i] from 0 to i -1
            // from arr[0], and assign this value to jumps[i]
            jumps[0]      = 0;
            jumpvalues[0] = -1;

            for (int i = 1; i < input.Length; i++)
            {
                jumps[i] = Int32.MaxValue; //Initialize with max and then we update with actual value
                //Here we need to see whether we can reach i from 0 to i -1...
                //Note i and j should not be equal because there is no reason to start and end at the same place. (No need to jump if the start and end are same)
                for (int j = 0; j < i; j++)
                {
                    //can we reach index i if we jump from j position
                    if (j + input[j] >= i && jumps[j] != Int32.MaxValue)
                    {
                        int steps = jumps[j] + 1;
                        if (steps < jumps[i])
                        {
                            //jumps[i] = min(jumps[i], jumps[j] + 1);
                            jumps[i]      = steps;
                            jumpvalues[i] = j; //index where it came from
                        }
                    }
                }
            }


            //Backtrack with jump values

            StringBuilder sb = new StringBuilder();
            int           k  = input.Length - 1;

            sb.Insert(0, "," + input[k]);

            while (k > 0)
            {
                int lastjumpfromIndex = jumpvalues[k];
                sb.Insert(0, "," + input[lastjumpfromIndex]);
                k = lastjumpfromIndex;
            }

            JumpItem result = new JumpItem();

            result.MinimumJump = jumps[input.Length - 1]; //get the lasat item
            result.Path        = sb.ToString();
            return(result);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //https://www.youtube.com/watch?v=cETfFsSTGJI

            int[] input = AlgorithmHelper.ConvertCommaSeparetedStringToInt(this.textBox15.Text);

            JumpItem result = MinimumNumberofJumpsDP(input);

            this.textBox12.Text = result.MinimumJump.ToString();
            this.textBox1.Text  = result.Path;
        }