zoukankan      html  css  js  c++  java
  • 计蒜客 蓝桥杯模拟 瞬间移动 dp

     

    在一个 n imes mn×m 中的方格中,每个格子上都有一个分数,现在蒜头君从 (1,1)(1,1) 的格子开始往 (n, m)(n,m) 的格子走。要求从 (x_1,y_1)(x1,y1) 到 (x_2,y_2)(x2,y2) ,满足 x_2 ge x_1, y_2 ge y_1x2x1, y2y1 。请问蒜头君从 (1,1)(1,1) 的点到 (n,m)(n,m) 最多可以得多少分?

    每个格子的分数只能得到一次,其中 (1,1)(1,1) 和 (n,m)(n,m) 是必须要走的两个格子,(1,1)(1,1) 表示第一行第一列的方格。

    输入格式

    第一行输入两个整数 n,mn,m ,表示有 n imes mn×m 个方格。

    接下来输入 nn 行 mm 列个整数 gradegrade 。

    数据范围与约定

    对于 100\%100% 的数据,-300 le grade le 300300grade300。

    对于 30\%30% 的数据, 1 le n,m le 51n,m5 。

    对于 60\%60% 的数据, 1 le n,m le 601n,m60 。

    对于 100\%100% 的数据, 1 le n,m le 5001n,m500

    输出格式

    输出一个整数表示蒜头君能获取到的最大分数。

    样例输入

    3 3
    1 2 3
    4 5 6
    7 8 9

    样例输出

    29

    题解:
    很容易的想到dp表达式 dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + a[i][j]
    但是这题目的意思是每个格子的分数可要可不要,(1,1),(n,m)格子的分数必须要
    所以在代码中得加几个判断,除(1,1),(n,m)外的其他小于0的分数都不要
    #include <map>
    #include <set>
    #include <stack>
    #include <cmath>
    #include <queue>
    #include <cstdio>
    #include <vector>
    #include <string>
    #include <bitset>
    #include <cstring>
    #include <iomanip>
    #include <iostream>
    #include <algorithm>
    #define ls (r<<1)
    #define rs (r<<1|1)
    #define debug(a) cout << #a << " " << a << endl
    using namespace std;
    typedef long long ll;
    const ll maxn = 1e3+10;
    const ll mod = 1e9+7;
    const double pi = acos(-1.0);
    const double eps = 1e-8;
    ll n, m, a[maxn][maxn], dp[maxn][maxn];
    int main() {
        scanf("%lld%lld",&n,&m);
        for( ll i = 1; i <= n; i ++ ) {
            for( ll j = 1; j <= m; j ++ ) {
                scanf("%lld",&a[i][j]);
            }
        }
        for( ll i = 1; i <= n; i ++ ) {
            for( ll j = 1; j <= m; j ++ ) {
                if( ( i == 1 && j == 1 ) || ( i == n && j == m ) ) {
                    dp[i][j] = a[i][j] + max(dp[i-1][j],dp[i][j-1]);
                } else {
                    dp[i][j] = max((ll)0,a[i][j]) + max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        cout << dp[n][m] << endl;
        return 0;
    }
    

      

  • 相关阅读:
    理解SynchronizationContext,如何在Winform里面跨线程访问UI控件
    ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题
    实战经验分享之C#对象XML序列化
    C#wxpay和alipay
    C#调用windows api 实现打印机控制
    C#winform程序关闭计算机的正确姿势
    自动化控制之线程池的使用
    自动化控制之重码校验
    (转)C#中的那些全局异常捕获
    android studio 2.32躺坑记
  • 原文地址:https://www.cnblogs.com/l609929321/p/10560815.html
Copyright © 2011-2022 走看看