一道算法题—平安果

  1. 简要描述: 
  2. 给定一个M行N列的矩阵(M*N个格子),每个格子中放着一定数量的平安果。 
  3. 你从左上角的各自开始,只能向下或者向右走,目的地是右下角的格子。 
  4. 每走过一个格子,就把格子上的平安果都收集起来。求你最多能收集到多少平安果。 
  5. 注意:当经过一个格子时,需要一次性把格子里的平安果都拿走。 
  6. 限制条件:1<N,M<=50;每个格子里的平安果数量是0到1000(包含0和1000). 
  7.  
  8. 输入描述: 
  9. 输入包含两部分: 
  10. 第一行M, N 
  11. 接下来M行,包含N个平安果数量 
  12.  
  13. 输出描述: 
  14. 一个整数 
  15. 最多拿走的平安果的数量 
  16.  
  17. 示例: 
  18.  
  19. 输入 
  20. 2 4 
  21. 1 2 3 40 
  22. 6 7 8 90 
  23.  
  24. 输出 
  25. 136 
  26. */  
  27.  1 #include <vector>  
     2 #include <iostream>  
     3 using namespace std;  
     4   
     5 //一道简单的dp问题  
     6 int main()  
     7 {  
     8 #if 1  
     9     freopen("in.txt", "r", stdin);  
    10 #endif  
    11     int m, n;  
    12     while(cin >> m >> n)  
    13     {  
    14         vector<vector<int>> ivec(m, vector<int>(n));  
    15         for(int i = 0; i < m; ++i)  
    16         {  
    17             for(int j = 0; j < n; ++j)  
    18             {  
    19                 cin >> ivec[i][j];  
    20             }  
    21         }  
    22         vector<vector<int>> dp(ivec);  
    23         //--------预处理  
    24         //初始化dp第一列  
    25         for(int i = 1; i < m; ++i)  
    26         {  
    27             dp[i][0] += dp[i - 1][0];  
    28         }  
    29         //初始化dp第一行  
    30         for(int j = 1; j < n; ++j)  
    31         {  
    32             dp[0][j] += dp[0][j - 1];  
    33         }  
    34         //计算dp的其他部分  
    35         for(int i = 1; i < m; ++i)  
    36         {  
    37             for(int j = 1; j < n; ++j)  
    38             {  
    39                 //原始dp[i][j]==ivec[i][j],所以这里没有另外再加+ivec[i][j]  
    40                 dp[i][j] += (dp[i - 1][j] < dp[i][j - 1]) ? dp[i][j - 1] : dp[i - 1][j];  
    41             }  
    42         }  
    43         cout << dp[m - 1][n - 1] << endl;  
    44     }  
    45     return 0;  
    46 } 

     1 // 递归求解
     2 //int getAppleIn(vector<vector<int> >& ivec, int m, int n, int row, int col)  
     3 //{  
     4 //  if(row >= m||col >= n)  
     5 //  {  
     6 //      return 0;  
     7 //  }  
     8 //  else if(row == m - 1)  
     9 //  {  
    10 //      int sum = 0;  
    11 //      for(int i = col; i < n; ++i)  
    12 //      {  
    13 //          sum += ivec[row][i];  
    14 //      }  
    15 //      return sum;  
    16 //  }  
    17 //  else if(col == n - 1)  
    18 //  {  
    19 //      int sum = 0;  
    20 //      for(int i = row; i < m; ++i)  
    21 //      {  
    22 //          sum += ivec[i][col];  
    23 //      }  
    24 //      return sum;  
    25 //  }  
    26 //  else  
    27 //  {  
    28 //      int sum = ivec[row][col];  
    29 //      int sum1 = getAppleIn(ivec, m, n, row + 1, col);  
    30 //      int sum2 = getAppleIn(ivec, m, n, row, col + 1);  
    31 //      return sum + (sum1 < sum2 ? sum2 : sum1);  
    32 //  }  
    33 //}  
    34 //  
    35 //int getApple(vector<vector<int> >& ivec, int m, int n)  
    36 //{  
    37 //  int sum = getAppleIn(ivec, m, n, 0, 0);  
    38 //  return sum;  
    39 //}  
    40 //  
    41 //int main()  
    42 //{  
    43 //#if 1  
    44 //  freopen("in.txt", "r", stdin);  
    45 //#endif  
    46 //  int m, n;  
    47 //  vector<vector<int>> ivec;  
    48 //  while(cin >> m >> n)  
    49 //  {  
    50 //      for(int i = 0; i < m; ++i)  
    51 //      {  
    52 //          vector<int> tem;  
    53 //          for(int j = 0; j < n; ++j)  
    54 //          {  
    55 //              int num;  
    56 //              cin >> num;  
    57 //              tem.push_back(num);  
    58 //          }  
    59 //          ivec.push_back(tem);  
    60 //      }  
    61 //      int res = getApple(ivec, m, n);  
    62 //      cout << res;  
    63 //  }  
    64 //  return 0;  
    65 //}  

    参考资料:http://blog.csdn.net/lizi_stdio/article/details/76618908

原文地址:https://www.cnblogs.com/smile233/p/8617526.html