社区讨论
这道题两次二维dp能过吗。
P1004[NOIP 2000 提高组] 方格取数参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhizpj6x
- 此快照首次捕获于
- 2025/11/03 18:21 4 个月前
- 此快照最后确认于
- 2025/11/03 18:21 4 个月前
我的做法是第一次dp时记录下路径,然后按照记录路径把走过的地方置0,再跑一次dp,最后取两次dp之和。
但是我的代码只有72分,不知道是代码实现的问题还是思路问题……看题解全部都是四维dp。
另外附上我的72pts代码。求条玄关。
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[15][15],d[15][15];
struct kku{
int d,x,y;
}f[15][15];
signed main(){
int x,y,w;
scanf("%lld%lld%lld%lld",&n,&x,&y,&w);
while(x && y && w){
a[x][y]=w;
scanf("%lld%lld%lld",&x,&y,&w);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(f[i-1][j].d>=f[i][j-1].d){
f[i][j].d=f[i-1][j].d+a[i][j];
f[i][j].x=i-1,f[i][j].y=j;
}else{
f[i][j].d=f[i][j-1].d+a[i][j];
f[i][j].x=i,f[i][j].y=j-1;
}
}
}
int xx,yy;
a[n][n]=a[1][1]=0;
x=f[n][n].x,y=f[n][n].y;
while(!(x<=1 && y<=1) || !(xx<=1 && yy<=1)){
a[x][y]=0;
// printf("%d %d\n",x,y);
xx=x,yy=y;
x=f[xx][yy].x,y=f[xx][yy].y;
}
// printf("%d %d\n",x,y);
a[x][y]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
d[i][j]=max(d[i-1][j]+a[i][j],d[i][j-1]+a[i][j]);
}
}
printf("%lld",f[n][n].d+d[n][n]);
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...