[南海云课堂] [DP] 最大价值
洛谷链接
题意
输入一个
思路
首先进行问题转换,可视作两个人同时从起点走向终点,每个点价值只被计算一次。
那便得到关键性质 同时,启发我们将两个人放在一起计算。
那么易想到暴力
考虑优化,观察到
再次整理思路,上一种方法可做但不清晰,不妨设
这样做时空复杂度是
考试时愣是没任何思路,这个故事告诉我们先写暴力是好习惯。
代码
价值可能为负,要注意初始化,以及坐标是否出界。
主要部分就在这:
for(int step=1; step<=2*n-1;step++){
for(int i=1; i<=n;i++){
for(int x=1; x<=n;x++){
int j=step-i+1,y=step-x+1;
if(j<1||j>n) continue;
if(y<1||y>n) continue;
f[step][i][x]=max(f[step-1][i-1][x-1],f[step][i][x]);
f[step][i][x]=max(f[step-1][i][x-1],f[step][i][x]);
f[step][i][x]=max(f[step-1][i-1][x],f[step][i][x]);
f[step][i][x]=max(f[step-1][i][x],f[step][i][x]);
f[step][i][x]+=a[i][j]+a[x][y];
if(i==x&&j==y){
f[step][i][x]-=a[i][j];
}
}
}
}