首页 > 其他分享 >Cf 429B [Working out]

Cf 429B [Working out]

时间:2022-12-25 22:13:41浏览次数:69  
标签:dp4 dp2 Working int res Cf long 1005 out

Cf 429B Working out

题意:

给定一个 nm 列的矩阵 A,在该矩阵中找出两条路径,要求:

  • 第一条路径从矩阵左上角 (1, 1) 走到矩阵右下角 (n, m),每次只能向下或向右走。
  • 第二条路径从矩阵左下角 (n, 1) 走到矩阵右上角 (1, m),每次只能向上或向右走。
  • 两条路径有且仅有一个交点。

找出两条路径,在满足上述要求的情况下,使得路径经过的点除交点外的权值之和尽量大,输出这一最大值。

数据范围:

\(3 \le n,m\le 1000\)

思路:

首先因为两个路径有且仅有一个交点,所以可以肯定,两条路径一定不会在网格的最外层相遇。

所以直接枚举剩下的相遇点取最优解即可。

dp预处理出从左上角和右下角,左下角和右上角到达 \((i,j)\) 四个方格 \((i - 1,j),(i + 1,j)(i,j - 1),(i,j + 1)\)最大值

实现:

#include <stdio.h>
#include <algorithm>
using namespace std;
long long grid[1005][1005];
long long dp1[1005][1005]; //(1,1)->(n,m)
long long dp2[1005][1005]; //(1,m)->(n,1)
long long dp3[1005][1005]; //(n,1)->(1,m)
long long dp4[1005][1005]; //(n,m)->(1,1)

int main()
{
    long long n, m;
    scanf("%lld%lld", &n, &m);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            scanf("%lld", &grid[i][j]);

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
        {
            //右上
            dp1[i][j] = max(dp1[i - 1][j], dp1[i][j - 1]) + grid[i][j];
        }

    for (int i = 1; i <= n; i++)
        for (int j = m; j > 0; j--)
        {
            //右下
            dp2[i][j] = max(dp2[i - 1][j], dp2[i][j + 1]) + grid[i][j];
        }

    for (int i = n; i > 0; i--)
        for (int j = 1; j <= m; j++)
        {
            //左上
            dp3[i][j] = max(dp3[i + 1][j], dp3[i][j - 1]) + grid[i][j];
        }

    for (int i = n; i > 0; i--)
        for (int j = m; j > 0; j--)
        {
            //左下
            dp4[i][j] = max(dp4[i + 1][j], dp4[i][j + 1]) + grid[i][j];
        }

    long long res = 0;
    for (int i = 2; i < n; i++)
        for (int j = 2; j < m; j++)
        {
            res = max(res, dp1[i - 1][j] + dp4[i + 1][j] + dp2[i][j + 1] + dp3[i][j - 1]);
            res = max(res, dp1[i][j - 1] + dp4[i][j + 1] + dp2[i - 1][j] + dp3[i + 1][j]);
        }

    printf("%lld\n", res);
}

标签:dp4,dp2,Working,int,res,Cf,long,1005,out
From: https://www.cnblogs.com/zxr000/p/17004689.html

相关文章

  • Cf 455A [Boredom]
    Cf455ABoredom题意:给出\(n\)个数字,从中选一个\(a_k\)删除,\(a_k\)为你获得的值,删除\(a_k\)后,如果数组里面有\(a_{k+1},a_{k-1}\)也会被删除,求获得值最大为......
  • Cf1625C Road Optimization
    Cf1625CRoadOptimization题意:在一条长为\(1\)的公路上有\(n\)个路标,第\(i\)个路标在第\(d_i\)米处,限速\(a_i\),意味着在这个路标到下一个路标之间的路段最快......
  • 【推荐系统算法实战】协同过滤 CF 算法(Collaborative Filtering)
    什么是协同过滤算法?协同过滤推荐(CollaborativeFilteringRecommendation)。仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。学术界对协同过滤算法进行了深......
  • CF732D Exams 题解
    题目链接题目分析:首先可以发现,如果当前第\(i\)天可以完成所有考试,那么第\(i+1\)天一定也可以。因此,答案具有单调性。考虑二分,将原问题转换为判定性问题。判定是否......
  • CF--795--E
    E.NumberofGroups关键感觉是一个很神奇的合并的方法。首先对这个区间进行左右拆点,然后进行排序处理。如果加进来的这个点是左端点,那就把在区间里面的左端点进行合并......
  • CF864C Bus 题解
    题目传送门题目大意一辆汽车从\(0\)到\(a\)往返\(k\div2\)次(也就是去算一次,回算一次);原来有\(b\)升油,每行驶一单位距离消耗一升油,在\(f\)有加油站(可以加满油......
  • CF1735A Working Week 题解
    题目传送门题目大意一周有\(n\)天,有三天休息日,其中第\(n\)天一定休息。现需要安排剩下的两个休息日,要求:不能使得休息日相邻。这两个休息日将\(n-1\)天分成三......
  • golang中goroutine泄漏的问题以及解决方案
    参考文章Golang中的goroutine泄漏问题如何退出协程goroutine(超时场景)如何退出协程goroutine(其他场景)问题纠正之前视频讲过一个知识点,如何设置子协裎超时机制,......
  • cf1763 —F. Edge Queries
    F.EdgeQuerieshttps://codeforces.ml/contest/1763/problem/F题意n个点m条边的无向图,保证一个点不会存在多个连通分量中,q次询问,问对于从u到v的所有路径上的边,删掉一条......
  • CF317A Perfect Pair 题解
    题目传送门题目大意给定一对数\(x\)和\(y\),允许把其中的一个数换成\(x+y\),问把\(x\)或\(y\)变成大于或等于\(m\)的数,需要几次操作。解题思路首先可以判断......