传送门
分析一下,我们可以用什么方法做?
- 记忆化搜索(dfs)
从
(
1
,
1
)
(1, 1)
(1,1) 开始一步一步往底层搜,记得标记,不然会超时
int r, ans, a[1005][1005], f[1005][1005];
int dfs(int x,int y)
{
if (x == r)
return a[x][y];
if(f[x][y] != -1)
return f[x][y];
f[x][y] = a[x][y] + max(dfs(x + 1, y), dfs(x + 1, y + 1));
return f[x][y];
}
int main(){
cin >> r;
memset(f, -1, sizeof(f));
for (int i = 1; i <= r; i++)
for(int j = 1; j <= i; j++)
cin >> a[i][j];
cout << dfs(1,1);
return 0;
}
- 动态规划
#include <queue>
#include <iomanip>
#include <iostream>
#include <memory.h>
#include <algorithm>
#define endl '\n'
#define ref(i, a, b, p) for(int i = a; i <= b; i += p)
#define gef(i, a, b, p) for(int i = a; i >= b; i -= p)
using namespace std;
int r;
int a[1005][1005][4], f[1005][1005];
void work()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> r;
ref(i, 1, r, 1)
ref(j, 1, i, 1)
{
cin >> a[i][j][1];
a[i][j][2] = a[i][j][1];
a[i][j][3] = 0;
}
gef(i, (r - 1), 1, 1)
ref(j, 1, i, 1)
if (a[i + 1][j][2] > a[i + 1][j + 1][2])
a[i][j][2] = a[i + 1][j][2] + a[i][j][2], a[i][j][3] = 0;
else
a[i][j][2] = a[i + 1][j + 1][2] + a[i][j][2], a[i][j][3] = 1;
cout << a[1][1][2] << endl;
int j = 1;
ref(i, 1, r, 1)
{
cout << a[i][j][1];
if (i != r)
cout << " -> ";
j += a[i][j][3];
}
return ;
}
int main()
{
work();
return 0;
}