社区讨论

这道题两次二维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 条回复,欢迎继续交流。

正在加载回复...