zoukankan      html  css  js  c++  java
  • 51nod 1083 矩阵取数问题【动态规划】

    一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值。

    例如:3 * 3的方格。

    1 3 3

    2 1 3

    2 2 1

    能够获得的最大价值为:11。

     收起

    输入

    第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

    思路:动态规划题最重要的就是要推导出递推式,首先设立dp数组,dp[i][j]表示坐标(i,j)处的最大值,由于只能向右或者向下,所以dp[i][j]的值就为dp[i][j],dp[i-1][j]+m[i][j]和dp[i][j-1]+m[i][j] 中最大的。

    另外要注意边界的处理,看代码大家应该可以理解,

    #include<cstdio>
    #include <iostream>
    using namespace std;
    //const int mod=1e9+7;
    const int maxn=505;
    int dp[maxn][maxn],m[maxn][maxn];
    
    int maxthree(int a,int b,int c)
    {
        a=a>b?a:b;
        a=a>c?a:c;
        return a;
    }
    
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;++i)
            for(int j=0;j<n;++j)
                scanf("%d",&m[i][j]);
            dp[0][0]=m[0][0];
        for(int i=1;i<n;++i)
        {
            dp[i][0]=dp[i-1][0]+m[i][0];
            dp[0][i]=dp[0][i-1]+m[0][i];
        }
        for(int i=1;i<n;++i)
        {
            for(int j=1;j<n;++j)
            {
                dp[i][j]=maxthree(dp[i][j],dp[i-1][j]+m[i][j],dp[i][j-1]+m[i][j]);
    
            }
        }
        printf("%d
    ",dp[n-1][n-1]);
        return 0;
    }
    
  • 相关阅读:
    文件上传漏洞之js验证
    文件上传漏洞靶机upload-labs(1到10)
    URI/URL/URN都是什么
    解压jdk报错gzip: stdin: not in gzip format
    burpsuite常见问题
    C/C++字符串反转的N种方法
    转 二叉树之Java实现二叉树基本操作
    MySQL 面试基础
    转 MySQL中的行级锁,表级锁,页级锁
    MySQL问题排查工具介绍
  • 原文地址:https://www.cnblogs.com/aerer/p/9930912.html
Copyright © 2011-2022 走看看