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列的最大值
因为只能向右走或向下走,所以每个格子也只能从上边走过来或者从左边走过来,也即是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; }
相关文章推荐
- 51Nod 1083 矩阵取数问题(基础DP)
- 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)
- 【51Nod】-1083 矩阵取数问题(DP)
- 51Nod-1083 矩阵取数问题【DP】
- 51NOD中的矩阵取数问题(1083,1084,1411)——动态规划,插头dp
- 51Nod 1083 矩阵取数问题 (DP)
- 【51Nod】1083 - 矩阵取数问题(dp)
- 51nod 1083 矩阵取数问题 ( dp
- 【dp基础课程】矩阵取数问题+最大子段和+最长公共子序列(LCS)【51nod】
- 1083 矩阵取数问题 分类: 51nod 2015-07-20 22:05 9人阅读 评
- 51nod 1084+1083 矩阵取数问题 dp
- 51nod--1083 矩阵取数问题
- 51nod 1084 矩阵取数问题 V2 dp
- 51nod 1083 矩阵取数问题
- [51Nod](1083) 矩阵取数问题 ---- 简单dp
- 51Nod 1083 矩阵取数问题 | 动态规划
- 51nod 1083 矩阵取数问题
- 51nod 1084 更难的矩阵取数问题(DP)
- 51Nod 1083 矩阵取数问题
- 51nod 1083 矩阵取数问题