DFS(会超时)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int n, res;
int p[N][N];
void dfs(int u, int l, int r, int cnt, int i, int j)
//u:第几层;l:选择左下几次;r:选择右下几次;cnt:当前总和;i:当前横坐标;j:当前纵坐标
{
if(u == n-1)
{
if(abs(l-r) < 2)
res = max(res, cnt);
return;
}
cnt += p[i+1][j];
dfs(u+1, l+1, r, cnt, i+1, j);
cnt -= p[i+1][j];
cnt += p[i+1][j+1];
dfs(u+1, l, r+1, cnt, i+1, j+1);
}
int main()
{
cin >> n;
for(int i=0; i<n; i++)
for(int j=0; j<=i; j++)
cin >> p[i][j];
dfs(0, 0, 0, p[0][0], 0, 0);
cout << res << endl;
return 0;
}
额,大佬问一下,为什么你在dfs右下之后不需要回溯一下cnt-=p[i+1][j+1];呢
就是因为每一次在这一层只会进行两个操作,第一个是dfs左下,第二个是dfs右下,所以dfs左下之后需要回溯不然会影响dfs右下,但dfs右下之后已经没有操作了,需要进行操作的地方已经是下一层,所以可以回溯也可以不回溯。当然也可以在后面写cnt-=p[i+1][j+1];,但是不影响结果了。
哦哦,懂了,感谢大佬
嗯嗯,不用客气
我爱你
写dfs要记忆化搜索