有如下一个数字三角形:

                        7
      3 8
     8 1 0
    2 7 4 4
   4 5 2 6 5

从定点出发,在每个节点可以选择向左走或者向右走,一直走到底层。试设计一种算法,计算从三角形顶端到底部的一条路径,是该路径经过的数字总和最大。

分析:这是一个动态规划问题,动态规划的思想就是在求解的过程中用到子问题,保存子问题的解,用空间换时间。

状态转移方程:tri[i][j]=tri[i][j]+max{tri[i+1][j],tri[i+1][j+1]};

其中i=n-2,n-3,...0,0<=j<=i;

代码实现:

public class DynamicProgram {
      //数字三角形问题
    private static final int NUM =100;
    /**
     * tri为数字三角形矩阵
     * n为数字三角形的层
     * */
    public int numbertri(int[][] tri,int n){
        int i ,j;
        for(i= n-2;i>=0;i--){
            for(j=0;j<=i;j++){
                if(tri[i+1][j]>tri[i+1][j+1]){
                    tri[i][j] += tri[i+1][j];                  
                }else
                    tri[i][j] +=tri[i+1][j+1];
            }
        }
        return tri[0][0];
    }
}

没有实现的问题:求出最优解路径,这是今天接下来的工作