方格取数

心已赠人 2022-03-07 10:52 447阅读 0赞

题目描述

设有N \times NN×N的方格图(N \le 9)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00。如下图所示(见样例):

  1. A
  2. 0 0 0 0 0 0 0 0
  3. 0 0 13 0 0 6 0 0
  4. 0 0 0 0 7 0 0 0
  5. 0 0 0 14 0 0 0 0
  6. 0 21 0 0 0 4 0 0
  7. 0 0 15 0 0 0 0 0
  8. 0 14 0 0 0 0 0 0
  9. 0 0 0 0 0 0 0 0
  10. B

某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)
此人从AA点到BB点共走两次,试找出22条这样的路径,使得取得的数之和为最大。

输入输出格式

输入格式:

输入的第一行为一个整数NN(表示N \times NN×N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的00表示输入结束。

输出格式:

只需输出一个整数,表示22条路径上取得的最大的和。

输入输出样例

输入样例#1: 复制

  1. 8
  2. 2 3 13
  3. 2 6 6
  4. 3 5 7
  5. 4 4 14
  6. 5 2 21
  7. 5 6 4
  8. 6 3 15
  9. 7 2 14
  10. 0 0 0

输出样例#1: 复制

  1. 67

说明

NOIP 2000 提高组第四题

【解析】

我们考虑两个人同时走,就相当于数字三角形。状态转移方程为:

f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l];f[i][j][k][l]=max(f[i−1][j][k−1][l],f[i−1][j][k][l−1],f[i][j−1][k−1][l],f[i][j−1][k][l−1])+a[i][j]+a[k][l];

不过要判断i=k&&j=l的情况。

动态规划的题目都需要先找到子问题,要想找到到B时的最大路径之和,就要分析到B有哪些路径,只能通过向下或者向由到达B,所以需要找到子问题有f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k][l-1],f[i][j-1][k-1][l]四个,只需要找到这四个的最大值再加上到达(i,j)点的值a[i][j]+a[k][l]即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cmath>
  4. using namespace std;
  5. int f[11][11][11][11],a[11][11];
  6. int main()
  7. {
  8. int n,x,y,z;
  9. scanf("%d",&n);
  10. while(1)
  11. {
  12. scanf("%d%d%d",&x,&y,&z);
  13. if(x == 0 && y == 0 && z == 0) break;
  14. a[x][y] = z;
  15. }
  16. for(int i = 1; i <= n; ++i)
  17. {
  18. for(int j = 1; j <= n; ++j)
  19. {
  20. for(int k = 1; k <= n; ++k)
  21. {
  22. for(int l = 1; l <= n; ++l)
  23. {
  24. f[i][j][k][l] = max(f[i-1][j][k-1][l],max(f[i-1][j][k][l-1],max(f[i][j-1][k-1][l],f[i][j-1][k][l-1])))+a[i][j]+a[k][l];
  25. if(i == k && j == l) f[i][j][k][l] -= a[i][j];//走过一次以后就会数就会变为0
  26. }
  27. }
  28. }
  29. }
  30. printf("%d",f[n][n][n][n]);
  31. return 0;
  32. }

发表评论

表情:
评论列表 (有 0 条评论,447人围观)

还没有评论,来说两句吧...

相关阅读

    相关 [NOIP2000]方格

    题目描述 设有\\(N×N\\)的方格图\\((N≤9)\\),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例): A 0 0 0

    相关 方格

    题目描述 设有N \\times NN×N的方格图(N \\le 9)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00。如下图所示(见样例):

    相关 方格问题 最小割

    题目背景 none! 题目描述 在一个有 m\n 个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最