经典水题数字三角形题解
题目描述
观察下面的数字金字塔。
写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大
输入格式
第一个行包含 R(1<= R<=1000) ,表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于100。
输出格式
单独的一行,包含那个可能得到的最大的和。
这道题第一步可能会想到贪心,即从上往下,每一步都选取最大的走
But 这道题是不能贪心的
for example 样例 Dp是30,贪心是28
如果我们从上面开始走,就会对我们下面的选择做出限制(即每个数只能往它下面的2个数走)
所以这道题Dp的思路是从下面开始往回推
每一步从下面加到上面选取最大的,即列出DP转移方程a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1])
就可以了
那么,再看看代码吧
#include<bits/stdc++.h> using namespace std; int a[1001][1001]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) cin>>a[i][j]; for(int i=n-1;i>=1;i--) for(int j=1;j<=i;j++) a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]); cout<<a[1][1]; return 0; }
这道经典的Dp水题就这么过了哦

浙公网安备 33010602011771号