记忆化搜索被卡?

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

空木秋人 @ 2020-10-22 17:17:28

第一次用动态规划做的过了,看题解说用搜索加记忆能做。本蒟蒻昨天刚学的记忆化搜索,才做了一道题。于是想加深一下理解。结果用记忆化倒数第二个测试点TLE。我怀疑是不是数据加强过了,现在记忆化能做吗?

int n,a[1005][1005],dp[1005][1005],ans;
int mem[1005][1005];

int solve(int x, int y){
    if(x==n) return a[x][y];
    return mem[x][y]?mem[x][y]:(mem[x][y]=max(solve(x+1,y),solve(x+1, y+1))+a[x][y]);
}

int main(){
//关闭同步,解除绑定
//std::ios::sync_with_stdio(false);
//std::cin.tie(0);
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        for (int j=1; j<=i; ++j) {
            scanf("%d",&a[i][j]);
        }
    }
    // for(int i=1;i<=n;++i){
    //     for (int j=1; j<=i; ++j) {
    //         dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j];
    //         if(dp[i][j]>ans) ans=dp[i][j];
    //     }
    // }
    printf("%d",solve(1, 1));
    return 0;
}

by Provicy @ 2020-10-22 17:20:02

记忆化数组开成-1

注意数据范围,权值全是0的时候你这个等于没记忆化


by 空木秋人 @ 2020-10-22 17:20:06

上面那个递归是用记忆宏写的,为了方便看我把它展开:

    if(mem[x][y]) return mem[x][y];
    else {
        mem[x][y]=max(solve(x+1,y),solve(x+1, y+1))+a[x][y];
    }
    return mem[x][y];

by 空木秋人 @ 2020-10-22 17:22:28

@Provicy Orz,懂了,我应该初始化为负值。


|