青少年编程知识记录 codecoming

【题解】采摘花生2

【题目描述】

Hello Kitty又一次来到花生地里摘花生,从左上角进入花生地,从右下角出去,只能向右或者向下,请问Hello Kitty应该沿着什么样的路线走,能够摘到的花生数量最多(假设花生地里没有任何2株的花生一样多,也不存在多条路线能够摘到一样多的花生的情况)?

比如输入:

2 2

1 2

3 4

应该输出:1-3-4,也就是按照1 3 4这三株数量的花生摘过去,能够摘到最多的花生!

【输入描述】

第一行是2个整数m和n(2=<m,n<=100),代表花生地有m行,n列花生!

后面m行,每行有n个整数代表了每行中,每株花生的数量

【输出描述】

输出Hello Kitty按照走过的路线中,摘到每株花生的数量。

【样例输入】

2 2  1 2   3 4

【样例输出】

1-3-4

【题目分析】

花生采摘题目基础之上修改的。





【参考答案】

#include <iostream>  using namespace std;    const int MAX = 100;  int w[MAX][MAX];  // 花生数量  int f[MAX][MAX];  // 最大花生数量  int path[MAX][MAX];  // 记录路径方向,0表示从上方,1表示从左方    void printPath(int i, int j) {      if (i == 0 && j == 0) {          cout << w[i][j];          return;      }      if (path[i][j] == 0) {          printPath(i - 1, j);      } else {          printPath(i, j - 1);      }      cout << "-" << w[i][j];  }    int main() {      int r, c;      cin >> r >> c;        // 输入花生数量      for (int i = 0; i < r; i++) {          for (int j = 0; j < c; j++) {              cin >> w[i][j];          }      }        // 初始化起点      f[0][0] = w[0][0];        // 动态规划计算最大花生数量      for (int i = 0; i < r; i++) {          for (int j = 0; j < c; j++) {              if (i == 0 && j == 0) continue;  // 起点已初始化              if (i == 0) {                  // 第一行只能从左方移动过来                  f[i][j] = f[i][j - 1] + w[i][j];                  path[i][j] = 1;  // 从左方              } else if (j == 0) {                  // 第一列只能从上方移动过来                  f[i][j] = f[i - 1][j] + w[i][j];                  path[i][j] = 0;  // 从上方              } else {                  // 其他情况,选择上方或左方中较大的                  if (f[i - 1][j] > f[i][j - 1]) {                      f[i][j] = f[i - 1][j] + w[i][j];                      path[i][j] = 0;  // 从上方                  } else {                      f[i][j] = f[i][j - 1] + w[i][j];                      path[i][j] = 1;  // 从左方                  }              }          }      }        // 输出路径      printPath(r - 1, c - 1);      cout << endl;      return 0;  }









作者:亿万年的星光 分类:题解目录 浏览: