您的位置:首页 > 编程语言 > Java开发

POJ3176-Cow Bowling(dp)

2017-07-04 11:31 351 查看
大致题意:

输入一个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
[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;
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj poj3176 dp java