POJ3176-Cow Bowling(dp)

来源:互联网 发布:台式电脑音箱推荐知乎 编辑:程序博客网 时间:2024/05/22 00:49

大致题意:
输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,权值之和最大的路线。
规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个数中的一个。

解题方法:
用二维数组way[][]靠左存储三角形内的数据,那么连线规则变更为
way[i][j] → Way[i+1][j]
或 Way[i][j] → Way[i+1][j+1]

注意:way[][]初始化为输入时的三角形数值,此时way[i][j]表示该点位置上的权值,没输入的位置初始化为0。

解题思路:
动态规划。
way[i][j]表示以第i行j列的位置作为终点的路线的最大权值。 (注意区分初始化时的意义)
那么way[i][j]的最大值取决于way[i-1][j-1]和way[i-1][j],从这两者之间筛选出最大值,加到way[i][j]上,即为way[i][j]的最大权值。
最后只要比较第n行中所有位置的权值way[n][j],最大的一个即为所求。

AC代码

package dp;import java.util.Scanner;public class Main{    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        Scanner scan=new Scanner(System.in);        int n=scan.nextInt();        int map[][]=new int[n+1][n+1];        init(map,n);        int sum=-1;        for(int i=1;i<=n;i++){            for(int j=1;j<=i;j++){                map[i][j]=scan.nextInt();                map[i][j]+=Math.max(map[i-1][j-1],map[i-1][j]);                if(i==n&&sum<map[i][j]){                    sum=map[i][j];                }            }        }//      for(int i=1;i<=n;i++){//          for(int j=1;j<=i;j++){//              map[i][j]+=Math.max(map[i-1][j-1],map[i-1][j]);//              if(i==n&&sum<map[i][j]){//                  sum=map[i][j];//              }//          }//          //      }        System.out.println(sum);    }    private static void init(int[][] map,int n) {        // TODO Auto-generated method stub        for(int i=0;i<=n;i++){            for(int j=0;j<=n;j++){                map[i][j]=0;            }        }    }}
原创粉丝点击