矩阵取数问题 DP

来源:互联网 发布:韩进海运破产原因知乎 编辑:程序博客网 时间:2024/06/05 09:52

给定一个m行n列的矩阵,矩阵每个元素是一个正整数,你现在在左上角(第一行第一列),你需要走到右下角(第m行,第n列),每次只能朝右或者下走到相邻的位置,不能走出矩阵。走过的数的总和作为你的得分,求最大的得分

数据范围

第1行:N,N为矩阵的大小。(2 <= N <= 500)
第2 - N + 1行:每行N个数,中间用空格隔开,对应格子中奖励的价值。(1 <= N[i] <= 10000)

输出

输出能够获得的最大价值

输入样例

3
1 3 3
2 1 3
2 2 1

输出样例

11

这里写图片描述

#include<stdio.h>#include <cstring>#include <algorithm>using namespace std;const long long INF = 0x3f3f3f3f;typedef long long LL;LL mp[550][550];LL dp[550][550];int main(){    int n;    scanf("%d",&n);    for (int i = 1;i <= n; ++i){        for (int j = 1;j <= n; ++j){            scanf("%lld",&mp[i][j]);;        }    }    for (int i = 1;i <= n; ++i){        dp[0][i] = -1;        dp[i][0] = -1;    }    for (int i = 1 ;i <= n; ++i){        for (int j = 1;j <= n; ++j){            if (i==1&&j==1) dp[i][j] = mp[i][j];            else dp[i][j] = max(dp[i-1][j],dp[i][j-1])+mp[i][j];        }    }    printf("%lld\n",dp[n][n]);    return 0;}
原创粉丝点击