cgxd @ 2024-07-15 14:57:36
#include<bits/stdc++.h>
using namespace std;
int n, ans = 0, s[1005][1005];
vector<vector<int>> v(1);
int dfs(int x, int y){
if(x == n)
return v[x][y];
if(s[x][y])
return s[x][y];
return s[x][y] = max(dfs(x + 1, y), dfs(x + 1, y + 1)) + v[x][y];
}signed main(){
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
vector<int> a(1);
for(int j = 1; j <= i; ++j){
int k;
scanf("%d", &k);
a.push_back(k);
}v.push_back(a);
}printf("%d", dfs(1, 1));
return 0;
}
by belif__kibo @ 2024-07-30 00:31:02
应该是#8没过吧,注意到点权可以是0,倘若他整张图的点权都是0,你用
if(s[x][y])
return s[x][y];
来剪枝完全就是对牛弹琴,因为他所有点的缓存都是0,你就吃满了2的n次方的操作次数,不TLE就怪了。
可以把所有点的缓存都初始化为-1,把剪枝部分改成
if(s[x][y]!=-1)
return s[x][y];
这样就能过了