poj1163 递归或dp
2012-04-09 21:24
281 查看
递归的版本:很可惜tle了。
想了一下,tle的原因主要是递归是从上往下计算的。那么用动规呢,从下往上计算。
--------------------------------------------------------------------------粉葛--------------------------------------------------------------------------
动规的版本:
其实动规跟上面的递归版本,差不是很多。都是从底层计算,然后向上层累加。只是递归版本的应该是需要递归很多次,所以算上递归返回的时间,就tle了吧。
package p1163; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class Main { static int count = 105; static int d[][] = new int[count][count]; static int n; public static void main(String[] args) throws FileNotFoundException { //File f = new File("c:\\data.txt"); //Scanner cin = new Scanner(f); Scanner cin = new Scanner(System.in); n = cin.nextInt(); for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { d[i][j] = cin.nextInt(); } } System.out.println(func(1, 1)); } // i行,j列,j<=i static int func(int i, int j) { int max = 0; if (i < n) { max = d[i][j] + max(func(i + 1, j), func(i + 1, j + 1));// 往下,往右 } else { max = d[i][j]; } return max; } static int max(int a, int b) { return a > b ? a : b; } }
想了一下,tle的原因主要是递归是从上往下计算的。那么用动规呢,从下往上计算。
--------------------------------------------------------------------------粉葛--------------------------------------------------------------------------
动规的版本:
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class Main { static int count = 105; static int d[][] = new int[count][count]; static int res[][] = new int[count][count];//使用res存储已经计算出来的数据 static int n; public static void main(String[] args) throws FileNotFoundException { //File f = new File("c:\\data.txt"); //Scanner cin = new Scanner(f); Scanner cin = new Scanner(System.in); n = cin.nextInt(); for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { d[i][j] = cin.nextInt(); } } for (int i = 1; i <= n; i++) { res [i] = d [i]; } // 从下往上动规 for (int i = n; i >= 1; i--) { for (int j = 0; j <= i; j++) { res[i][j] = d[i][j] + max(res[i + 1][j], res[i + 1][j + 1]); } } System.out.println(res[1][1]);//最后,res数组的顶层的那个元素就是要求的最大值 } static int max(int a, int b) { return a > b ? a : b; } }
其实动规跟上面的递归版本,差不是很多。都是从底层计算,然后向上层累加。只是递归版本的应该是需要递归很多次,所以算上递归返回的时间,就tle了吧。
相关文章推荐
- POJ 1163 The Triangle【dp+杨辉三角加强版(递归)】
- POJ 1163 The Triangle【DP】递归和递推
- POJ1163 The Triangle dp C语言
- POJ 1163 The Triangle [DP]
- POJ 1163 The Triangle 简单DP
- POJ 1664 放苹果(递归或DP)
- POJ 2250 Compromise (线性dp LCS +递归路径)
- POJ 1163 The Triangle 简单DP
- POJ 1163 The Triangle (简单DP)
- poj 1163 the triangle(dp)
- poj1163——The Triangle(简单dp)
- POJ 1664 放苹果(递归或DP)
- poj 1163 The Triangle(DP水水 = =第二次写!)
- 基础DP01(POJ1163, HDU1421,POJ2533)
- hdu 2084 & POJ 1163 数塔 (dp)
- POJ 1163 经典三角形DP重写
- poj 1163 The Triangle --dp
- poj 1191棋盘分割(递归dp, 记忆化搜索)
- poj 1163经典DP
- DP专题1 POJ 1163 The Triangle