动态规划

1.坐标形动态规划

相关图形(三角形),代码在二维矩阵中,往下走,往右走。

给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。

如:

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]
public static int minimumTotal(int[][] triangle)
    {
        if (triangle == null || triangle.length == 0)
        {
            //行不为0
            return -1;
        }

        if (triangle[0] == null || triangle[0].length == 0)
        {
            //列不为0
            return -1;
        }


        int n = triangle.length;
        int [][] f = new int[n][n];
        //初始化 起点
        f[0][0] = triangle[0][0];
        //初始化三角形的左边和右边
        for (int i = 1; i < n ;i++)
        {
            f[i][0] = f[i - 1][0] + triangle[i][0];
            f[i][i] = f[i-1][i-1] + triangle[i][i];
        }
        //自上而下初始化三角形中间重复计算的部分(筛选出最小值)
        for (int i = 1; i < n; i++)
        {
            for (int j = 1; j < i; j++)
            {
                f[i][j] = Math.min(f[i-1][j],f[i-1][j-1])  + triangle[i][j];
                System.out.printf("i = %d,j = %d,value = %d\n",i,j,f[i][j]);
            }
        }
        //answer终点(求出最小值)
        int best = f[n-1][0];
        for (int i = 1; i < n; i++)
        {
            best = Math.min(best,f[n-1][i]);
        }
        return best;
}

 

posted @ 2016-02-26 09:56  forrHuen  阅读(167)  评论(0编辑  收藏  举报