题意:就从(1,1)出发终点是(n,m),每次移动只能向右一格,并且纵坐标变化不能大于1,路径上的金币都能吃到,问最大金币。
题解:看到这题就很自然的觉得是个dp(雾),然后问操作的时候注意了一下 当i>j的地方是到不了的,所以dp数组初值为0,然后就是一个很简单的dp啦
#include <bits/stdc++.h> using namespace std; typedef long long ll; int n,m; const int N=105; int a[N][N]; int dp[N][N]; int main() { cin>>n>>m; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) scanf("%d",&a[i][j]); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (j>=i) dp[i][j]=a[i][j]; for (int j=1;j<=m;j++) for (int i=1;i<=n;i++) dp[i][j]+=max(dp[i-1][j-1],max(dp[i][j-1],dp[i+1][j-1])); cout<<dp[n][m]<<endl; return 0; }