思路就是动态规划。dp[i][j]表示(0,0)到(i,j)的最大价值。可以思考一下,dp[i][j]的值取决于谁。因为只能向下向右走,所以它的值取决于它的上面和左面的dp值,so,
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+map[i][j]
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[505][505];
int map[505][505];
int main()
{
  int n;
  cin>>n; 
  memset(dp,0,sizeof(0));
  for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
      cin>>map[i][j];
  dp[0][0]=map[0][0];
  for(int i=1;i<n;i++)
    dp[i][0]+=dp[i-1][0]+map[i][0]; 
  for(int i=1;i<n;i++)
    dp[0][i]+=dp[0][i-1]+map[0][i];
  for(int i=1;i<n;i++)
    for(int j=1;j<n;j++)
      dp[i][j]+=max(dp[i-1][j],dp[i][j-1])+map[i][j];
  cout<<dp[n-1][n-1]<<endl;
  return 0;
}