POJ1163 The Triangle
2014-11-29 13:31
381 查看
这是一道很简单的动态规划的题目,就是求三角形从上至下的一条最长路径之和,每次都只能选择自己右下或者左下的两个点来走
刚开始输入一个N 表示是一个直角边长为 N的三角形
要求第一行到最底下的最长路径,就得知道从第二行到最底下的最长路径,故依次类推,推导到最后一行,实际上就成了一个递归
当在最后一行的时候就是maxsum[i][j]=D[i][j],其余的则是maxsum[i][j] =max(maxsum[i+1][j],maxsum[i+1][j+1])+D[i][j]
实际上这样还是太浪费空间,如果不用二维数组,我直接用一个一维数组来保存没行的最大值maxsum[j]=max(maxsum[j],maxsum[j+1])+D[i][j]
最后输出的值为maxsum[1] .
输入
5
7
3 8
8 1 0
2 7 4 4
45265
输出
30
刚开始输入一个N 表示是一个直角边长为 N的三角形
要求第一行到最底下的最长路径,就得知道从第二行到最底下的最长路径,故依次类推,推导到最后一行,实际上就成了一个递归
当在最后一行的时候就是maxsum[i][j]=D[i][j],其余的则是maxsum[i][j] =max(maxsum[i+1][j],maxsum[i+1][j+1])+D[i][j]
实际上这样还是太浪费空间,如果不用二维数组,我直接用一个一维数组来保存没行的最大值maxsum[j]=max(maxsum[j],maxsum[j+1])+D[i][j]
最后输出的值为maxsum[1] .
输入
5
7
3 8
8 1 0
2 7 4 4
45265
输出
30
#include<stdio.h> const int max=101; int MAX(int a,int b ) { return a>b?a:b; } int main() { int d[max][max],n; int *maxsum; scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&d[i][j]); maxsum=d ; for(int i=n-1;i>=1;i--) for(int j=1;j<=i;j++) maxsum[j]=MAX(maxsum[j],maxsum[j+1])+d[i][j]; printf("%d\n",maxsum[1]); return 0; }
相关文章推荐
- POJ-1163 The Triangle 「数字三角形」(dfs+记忆化)
- [DP] POJ 1163 The Triangle
- POJ1163 The Triangle
- POJ 1163 The Triangle数塔 动态规划
- POJ 1163 The Triangle
- POJ 1163 The Triangle (简单线性dp)
- POJ 1163 The Triangle (动态规划)
- poj 1163 The Triangle
- POJ 1163 The Triangle(DP)
- 0808 poj#1163 The Triangle
- POJ-1163-The Triangle-递推动规
- poj 1163-小白算法练习 The Triangle 动态规划
- poj 1163 The Triangle 动态规划
- poj 1163__The Triangle(dp)
- poj 1163 The Triangle
- POJ 1163 The Triangle
- POJ 1163 The Triangle(DP 数塔问题)
- POJ-1163-The Triangle
- POJ 1163 The Triangle 解题报告
- poj 1163 The Triangle 动态规划