NC25147. 金币馅饼
描述
比方说,奶牛们把馅饼排成如下的矩阵,矩阵中的数字表示该位置的馅饼中含金币的数量:
起点-> 6 5 3 7 9 2 7
2 4 3 5 6 8 6
4 9 9 9 1 5 8 <-终点
以下是一条合法的路线:
起点-> 6 5 3 7 9 2 7
\
2 4 3 5 6 8 6
\ / \
4 9 9-9 1 5-8 <-终点
按上述的路线进行走动,一共可以获得6+4+9+9+6+5+8=47个金币。按照规则,在这个矩阵中最多可以得到50个金币,路线如下图所示:
起点-> 6 5 3 7 9 2 7
\
2 4 3 5 6-8 6
\ / \
4 9 9-9 1 5 8 <-终点
(请复制到记事本中用等宽字体查看)
输入描述
第1行: 两个用空格隔开的整数,R和C
第2..R+1行: 每行包含C个用空格隔开的正整数,依次表示一行中从左往右各个馅饼里金币的数量
输出描述
第1行: 输出一个正整数,表示你所能收集到的最大金币数目
示例1
输入:
3 7 6 5 3 7 9 2 7 2 4 3 5 6 8 6 4 9 9 9 1 5 8
输出:
50
C++14(g++5.4) 解法, 执行用时: 6ms, 内存消耗: 488K, 提交时间: 2019-07-08 11:34:58
#include<iostream> #include<algorithm> using namespace std; int r,c,a[105][105]; int main() { cin>>r>>c; for(int i=1;i<=r;++i)for(int j=1;j<=c;++j){cin>>a[i][j];if(j<i||j-i>c-r)a[i][j]=0;} for(int j=1;j<=c;++j)for(int i=1;i<=r;++i)if(j>=i) { a[i][j]+=max(max(a[i-1][j-1],a[i][j-1]),a[i+1][j-1]); } cout<<a[r][c]; return 0; }
Python3 解法, 执行用时: 33ms, 内存消耗: 3096K, 提交时间: 2021-05-28 13:21:11
r, c = map(int, input().split()) ls = [list(map(int,input().split())) for i in range(r)] dp=[[0 for i in range(c+1)] for i in range(r+1)] for j in range(c): for i in range(r): if i<=j: dp[i][j]=max(dp[i+1][j-1],\ max(dp[i][j-1],dp[i-1][j-1]))+ls[i][j]; print(dp[r-1][c-1])
C++11(clang++ 3.9) 解法, 执行用时: 7ms, 内存消耗: 496K, 提交时间: 2020-02-17 17:36:47
#include<iostream> using namespace std; int r,c,ar[105][105],dp[105][105]; int main() { cin>>r>>c; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) cin>>ar[i][j]; for(int j=1;j<=c;j++) for(int i=1;i<=r&&i<=j;i++) dp[i][j]=max(dp[i+1][j-1],max(dp[i][j-1],dp[i-1][j-1]))+ar[i][j]; cout<<dp[r][c]; return 0; }