一道算法题—平安果
- 简要描述:
- 给定一个M行N列的矩阵(M*N个格子),每个格子中放着一定数量的平安果。
- 你从左上角的各自开始,只能向下或者向右走,目的地是右下角的格子。
- 每走过一个格子,就把格子上的平安果都收集起来。求你最多能收集到多少平安果。
- 注意:当经过一个格子时,需要一次性把格子里的平安果都拿走。
- 限制条件:1<N,M<=50;每个格子里的平安果数量是0到1000(包含0和1000).
- 输入描述:
- 输入包含两部分:
- 第一行M, N
- 接下来M行,包含N个平安果数量
- 输出描述:
- 一个整数
- 最多拿走的平安果的数量
- 示例:
- 输入
- 2 4
- 1 2 3 40
- 6 7 8 90
- 输出
- 136
- */
-
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