您的位置:首页 > 其它

51nod 1083 矩阵取数问题(基础dp)

2017-05-09 12:50 344 查看
先用记忆化搜索写的,然后用两重循环dp的

因为只能向右走或向下走,所以每个格子也只能从上边走过来或者从左边走过来,也即是dp[i][j]=max(dp[i-1][j],dp[i][j-1])+G[i][j];dp[i][j]表示走到第i行第j列的最大值

#include <cstdio>
#include <cstring>
#include <algorithm>
using  namespace  std;

const int MAXN = 510;
int G[MAXN][MAXN];
int dp[MAXN][MAXN];
int n;

int dfs(int i, int j)
{
if(dp[i][j] > 0)
return dp[i][j];
if(i == n && j == n)
{
return dp[i][j] = G[i][j];
}
if(i == n && j < n)
return dp[i][j] = G[i][j]+dfs(i,j+1);
else if(i < n && j == n)
return dp[i][j] = G[i][j]+dfs(i+1,j);
else
return dp[i][j] = max(G[i][j]+dfs(i+1,j),G[i][j]+dfs(i,j+1));
}
/*
int main()
{
scanf("%d",&n);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
scanf("%d",&G[i][j]);
printf("%d\n",dfs(1,1));
return 0;
}
*/

int main()
{
scanf("%d",&n);
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
scanf("%d",&G[i][j]);
}
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])+G[i][j];
}
printf("%d\n",dp

);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: