方格取数(动态规划经典题)

墨蓝 2022-06-10 05:18 335阅读 0赞

描述

设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例):< p=””>

1444824807.png

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

输入

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

输出

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

样例输入

  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. 67

来源

NOIP2000复赛 提高组 第四题

20170810210823678

  1. 设状态:f[i][j][h][k];//表示两条路同时走,第一条路径走到(i,j)时,第二条走到(h,k)时的最大数字和;

  2. 初始状态:f[0][0][0][0]=0;

最终状态:f[n][n][n][n];

  1. 状态转移方程:当i==h&&j==k时,f[i][j][h][k]=max{f[i-1][j][h-1][k],f[i][j-1][h][k-1],f[i-1][j][h][k-1],f[i][j-1][h-1][k])+a[i][j];//取上上,左左,上左,左上四个方向的最大值加上当前的值;

当i!=h&&j!=k时,f[i][j][h][k]=max{f[i-1][j][h-1][k],f[i][j-1][h][k-1],f[i-1][j][h][k-1],f[i][j-1][h-1][k])+a[i][j]+a[h][k];//取上上,左左,上左,左上四个方向的最大值加上两条路径当前的值;

  1. /*
  2. 8
  3. 2 3 13
  4. 2 6 6
  5. 3 5 7
  6. 4 4 14
  7. 5 2 21
  8. 5 6 4
  9. 6 3 15
  10. 7 2 14
  11. 0 0 0
  12. */
  13. #include<iostream>
  14. using namespace std;
  15. int f[51][51][51][51];//f[i][j][h][k]表示第一条路径走到第(i,j)点,第二条路径走到第(h,k)点时最大数字和
  16. int a[51][51];//存储方格中的数,例如2 3 13,表示a[2][3]=13;
  17. int n,i,j,h,k,x,y,z;
  18. int main()
  19. {
  20. cin>>n;
  21. while(cin>>x>>y>>z)//输入数据
  22. {
  23. if(x==0&&y==0&&z==0) break;
  24. a[x][y]=z;
  25. }
  26. for(i=1;i<=n;i++)
  27. {
  28. for(j=1;j<=n;j++)
  29. {
  30. for(h=1;h<=n;h++)
  31. {
  32. for(k=1;k<=n;k++)
  33. {
  34. int tmp1=max(f[i-1][j][h-1][k],f[i][j-1][h][k-1]);//上上、左左两个方向
  35. int tmp2=max(f[i][j-1][h-1][k],f[i-1][j][h][k-1]);//左上、上左两个方向
  36. f[i][j][h][k]=max(tmp1,tmp2)+a[i][j];
  37. if(i!=h&&j!=k) f[i][j][h][k]+=a[h][k];
  38. }
  39. }
  40. }
  41. }
  42. cout<<f[n][n][n][n]<<endl;
  43. return 0;
  44. }

发表评论

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

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

相关阅读

    相关 [NOIP2000]方格

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

    相关 (动态规划问题)机器人走方格

    有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y,请返回机器人的

    相关 方格

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