求助

P1004 [NOIP2000 提高组] 方格取数

```c++ #include<bits/stdc++.h> using namespace std; int n; int dp[20][20][20][20]; int a[20][20]; int main() { cin>>n; while(true) { int x, y,z; cin>>x>>y>>z; if(x==0&&y==0&&z==0)break; a[x][y]=z; } for(int x1=1;x1<=n;x1++) { for(int y1=1;y1<=n;y1++) { for(int x2=1;x2<=n;x2++) { for(int y2=1;y2<=n;y2++) { dp[x1][y1][x2][y2]=max(dp[x1-1][y1][x2-1][y2],dp[x1][y1-1][x2][y2-1]); dp[x1][y1][x2][y2]=max(dp[x1-1][y1][x2][y2-1],dp[x1][y1-1][x2-1][y2]); dp[x1][y1][x2][y2]=dp[x1][y1][x2][y2]+a[x1][y1]+a[x2][y2]; if(x1==x2&&y1==y2)dp[x1][y1][x2][y2]-=a[x2][y2]; } } } } cout<<dp[n][n][n][n]; return 0; } ``` 你的代码公式那里有问题
by wuxiuyuan @ 2023-10-14 13:14:26


不应该是求四个数的最大值吗,你看看你在求什么
by wuxiuyuan @ 2023-10-14 13:15:17


改完后的 ```c++ #include<bits/stdc++.h> using namespace std; int n; int dp[20][20][20][20]; int a[20][20]; int main() { cin>>n; while(true) { int x, y,z; cin>>x>>y>>z; if(x==0&&y==0&&z==0)break; a[x][y]=z; } for(int x1=1;x1<=n;x1++) { for(int y1=1;y1<=n;y1++) { for(int x2=1;x2<=n;x2++) { for(int y2=1;y2<=n;y2++) { dp[x1][y1][x2][y2]=max(dp[x1-1][y1][x2-1][y2],dp[x1][y1-1][x2][y2-1]); dp[x1][y1][x2][y2]=max(dp[x1-1][y1][x2][y2-1],dp[x1][y1][x2][y2]) dp[x1][y1][x2][y2]=max(dp[x1][y1][x2][y2],dp[x1][y1-1][x2-1][y2]); dp[x1][y1][x2][y2]=dp[x1][y1][x2][y2]+a[x1][y1]+a[x2][y2]; if(x1==x2&&y1==y2)dp[x1][y1][x2][y2]-=a[x2][y2]; } } } } cout<<dp[n][n][n][n]; return 0; } ```
by wuxiuyuan @ 2023-10-14 13:16:26


@[wuxiuyuan](/user/701478) 谢谢
by dmx7u19x @ 2023-10-19 13:00:05


|