测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A52000. 方格取数

填空题 中等

题目描述

方格取数

题目描述

设有N×N的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示:


某人从图中的左上角A出发,可以向下行走,也可以向右行走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。

此人从A点到B点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。

输入

第一行为一个整数N(N≤10),表示N×N的方格图。

接下来的每行有三个整数,第一个为行号数,第二个为列号数,第三个为在该行、该列上所放的数。一行“0 0 0”表示结束。

输出

第一个整数,表示两条路径上取得的最大的和。

样例输入

8

2 3 13

2 6 6

3 5 7

4 4 14

5 2 21

5 6 4

6 3 15

7 2 14

0 0 0

样例输出

67

参考答案

#include <iostream> #include <algorithm> #include<string.h> using namespace std; int main() { int n,a,b,c; cin>>n; int dp[n+5][n+5][n+5][n+5],f[n+5][n+5]; memset(dp,0,sizeof(dp)); memset(f,0,sizeof(f)); while(cin>>a>>b>>c){ if(a==0&&b==0&&c==0)break; f[a][b]=c; } dp[1][1][1][1]=f[1][1]; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ for(int x=1;x<=n;x++){ for(int y=1;y<=n;y++){ if((i+j)!=(x+y))continue; dp[i][j][x][y]=max(max(dp[i][j-1][x-1][y],dp[i-1][j][x-1][y]),max(dp[i][j-1][x][y-1],dp[i-1][j][x][y-1])); if(i==x&&j==y)dp[i][j][x][y]+=f[i][j]; else dp[i][j][x][y]+=f[i][j]+f[x][y]; } } } } cout<<dp[n][n][n][n]; return 0; }
上一题 下一题