传送门:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1083
题目描述:一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值。
f[i][j]表示到达i,j位置能够获得的最大价值,dp公式是f[i][j]=max{f[i-1][j],f[i][j-1]},边界条件f[0][j]=f[i][0]=-1,f[1][1]=a[1][1]。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 505;
int a[maxn][maxn],f[maxn][maxn];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
memset(f,0,sizeof f);
for(int i=0;i<=n;i++)
f[i][0]=f[0][i]=-1;
f[1][1]=a[1][1];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==1&&j==1) continue;
f[i][j]=max(f[i-1][j],f[i][j-1])+a[i][j];
}
cout<<f[n][n]<<endl;
return 0;
}