菜题 P1216数字三角形 Number Triangles
简介
很简单的一道dp练手题,,,
他不是简不简单的问题,
他真的是那种,很少见的那种
题目(from 洛谷)
题目描述
观察下面的数字金字塔。
写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
上思路
** 显 然 **
状态转移:
f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j]
f即为到达i j格用最短长度 a即为每格子中数值
注意递推的顺序
上代码
#include <bits/stdc++.h>
#define N 1010
using namespace std;
int a[N][N],f[N][N],x;
int main(){
cin>>x;
for(int i=1;i<=x;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
for(int i=x;i>=1;i--){
for(int j=i;j>=1;j--){
f[i][j]=max(f[i+1][j],f[i+1][j+1])+a[i][j];
}
}
cout<<f[1][1]<<endl;
return 0;
}