P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles
各位巨佬,大家好,你们那打不死的小蒟蒻又来了
今天,小蒟蒻带来一道十分经典的题目——数字三角形
对于目前智商零下的小蒟蒻来说,可是一道非常难的题目,可经过几天的磨练,我终于做出来了😭😭😭
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
根据题意,要从头找一条到底部的路径,使它所经过的数字和最小,本蒟蒻便有了以下几种想法:
- 贪心:
从第一步起,每步都找下面中最大的一个
↓
7
↓
3 8
↓
8 1 0
↓
2 7 4 4
↓
4 5 2 6 5
嗯嗯嗯……样例都没过我bbbb
2. 根据几天的思考,我终于知道了,要从反面思考
从底部开始,i,j这个位置也就是i,j这个位上的数加下面能到达i,j的最大路径
为此附上代码请巨佬勿吐槽 :
/*
a[][]在这里既是原数组,也是d[][]
x1(i,j)
x2(i+1,j) x3(i+1,j+1)
d[i][j]=max(d[i+1][j],d[i+1][j+1])+a[i][j]
即 a[i][j]=max(a[i+1][j],a[i+1][j+1])+a[i][j]
*/
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int a[N][N],n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>a[i][j];
}
}
//4 5 2 6 5 最后一层到达它本身的路线就是自己
for(int i=n-1;i>=1;i--)
{
/*
⑤→ 7
④→ 3 8
③→ 8 1 0
②→ 2 7 4 4
①→ 4 5 2 6 5
所以第一层for从后往前
第二层for从前往后
*/
for(int j=1;j<=i;j++)
{
a[i][j]=max(a[i+1][j],a[i+1][j+1])+a[i][j];
}
}
cout<<a[1][1]<<endl;
return 0;
}
谢谢各位巨佬的观看byebye