一位大佬教我写的题!!!!!!!!!!!!!
题目描述
描述 Description
观察下面的数字金字塔。写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大输入格式 Input Format
第一个行包含 R(1<= R<=1000) ,表示行的数目。后面每行为这个数字金字塔特定行包含的整数。
所有的被供应的整数是非负的且不大于100。
输出格式 Output Format
单独的一行,包含那个可能得到的最大的和。样例输入 Sample Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5样例输出 Sample Output
30
思路
对于这一道题而言,由于路径过多,而且不好记录。所以,我们考虑DP。
设
f
[
i
,
j
]
f[i,j]
f[i,j]表示的是从顶点到达
(
i
,
j
)
(i,j)
(i,j)这个点的最大的价值;
之后,我们考虑如何转移:对于每一个点而言,都有两个点可以到达它,所以,该点的状态就可以由能够到达它的的点的状态转移而来。
f
[
i
,
j
]
=
m
a
x
(
f
[
i
−
1
]
[
j
−
1
]
,
f
[
i
−
1
]
[
j
]
)
+
a
[
i
,
j
]
f[i,j]=max(f[i-1][j-1], f[i-1][j])+a[i,j]
f[i,j]=max(f[i−1][j−1],f[i−1][j])+a[i,j]
code
#include<bits/stdc++.h>
using namespace std;
const int nn=503;
int n, a[nn][nn], f[nn][nn];
int ans=-1e6;
int main()
{
cin>>n;
memset(f,0xcf,sizeof(f));
f[0][0]=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=i;++j)
{
cin>>a[i][j];
f[i][j]=max(f[i-1][j-1], f[i-1][j])+a[i][j];
}
for(int i=1;i<=n;++i)
ans=max(ans,f[n][i]);
cout<<ans<<endl;
return 0;
}
完……
(于2019/10/08重构。)