dfs89求调

P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles

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];

这样就能过了


|