DFS20分求助

P1004 [NOIP2000 提高组] 方格取数

@[违规用户名9iL(8Z](/user/341801) 此题正解是 dp 。
by 初雪_matt @ 2021-07-19 09:12:09


@[初雪_matt](/user/360083) 我知道,但是看数据范围貌似记忆化也可做
by FChtholly @ 2021-07-19 09:13:02


@[违规用户名9iL(8Z](/user/341801) 详见[这篇题解](https://www.luogu.com.cn/blog/wozaixuexi/solution-p1004)
by 初雪_matt @ 2021-07-19 09:14:45


@[初雪_matt](/user/360083) 谢谢
by FChtholly @ 2021-07-19 09:18:20


```cpp #include <bits/stdc++.h> using namespace std; int n; int a[107][107]; int dp[17][17][17][17]; int x,y,z; int dfs(int x,int y,int x1,int y1){ if(dp[x][y][x1][y1]!=-1){ return dp[x][y][x1][y1]; } if(x==n&&y==n&&x1==n&&y1==n){ return 0; } int ans=0; if(x<n&&x1<n){ ans=max(ans,dfs(x+1,y,x1+1,y1)+a[x+1][y]+a[x1+1][y1]-a[x+1][y]*(x+1==x1+1&&y==y1)); } if(x<n&&y1<n){ ans=max(ans,dfs(x+1,y,x1,y1+1)+a[x+1][y]+a[x1][y1+1]-a[x+1][y]*(x+1==x1&&y==y1+1)); } if(y<n&&x1<n){ ans=max(ans,dfs(x,y+1,x1+1,y1)+a[x][y+1]+a[x1+1][y1]-a[x+1][y]*(x==x1+1&&y+1==y1)); } if(y<n&&y1<n){ ans=max(ans,dfs(x,y+1,x1,y1+1)+a[x][y+1]+a[x1][y1+1]-a[x][y+1]*(x==x1&&y+1==y1+1)); } dp[x][y][x1][y1]=ans; return ans; } int main(){ cin>>n; for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ for(int k=0;k<=n;k++){ for(int x=0;x<=n;x++){ dp[i][j][k][x]=-1; } } } } do{ cin>>x>>y>>z; a[x][y]=z; }while(x!=0&&y!=0&&z!=0); cout<<dfs(1,1,1,1)+a[1][1]; return 0; } ```
by FChtholly @ 2021-07-19 10:17:22


|