空木秋人 @ 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,懂了,我应该初始化为负值。