Problem - 2194E - Codeforces

Problem - 2194E - Codeforces

维护起点到ij 的距离以及ij到结尾的最大权值 那么包含某个点的最大权值就出来了

我们维护一下同一条对角线上所有点的最大路径权值的最大值和第二大值

然后对于每个路径 一定都会经过每个对角线的一个点 然后我们枚举每个点作为变成负数的点

那么这个点的最大路径就是走这条路的最大值也就是最大值-2aij 或者是不走这条路 走经过这条对角线的最大的那条 如果已经是最大的就选第二大的

至于为什么选择对角线: 因为不选ij 就代表i j 点所在的对角线上没有元素 那么就要在这条对角线上选择一个元素 所以维护了某个对角线上的最大路径;

代码如下:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
void solve(){
    int n,m;
    cin>>n>>m;
    vector<vector<int>>a(n+2,vector<int>(m+2)),s2(n+2,vector<int>(m+2)),s1(n+2,vector<int>(m+2));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            if(i==1&&j==1)s1[i][j]=a[i][j];
            else if (i == 1) {
                s1[i][j] = s1[i][j-1] + a[i][j]; 
            } else if (j == 1) {
                s1[i][j] = s1[i-1][j] + a[i][j];  
            } else {
                s1[i][j] = max(s1[i-1][j], s1[i][j-1]) + a[i][j]; 
            }
        }
    }
    for (int i = n; i >= 1; i--) {
        for (int j = m; j >= 1; j--) {
            if (i == n && j == m) {
                s2[i][j] = a[i][j];  
            } else if (i == n) {
                s2[i][j] = s2[i][j+1] + a[i][j];
            } else if (j == m) {
                s2[i][j] = s2[i+1][j] + a[i][j]; 
            } else {
                s2[i][j] = max(s2[i+1][j], s2[i][j+1]) + a[i][j];  
            }
        }
    }
    vector<int> m1(n + m + 2, -INF);  
    vector<int> m2(n + m + 2, -INF);  
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int k=i+j;
            int tot=s1[i][j]+s2[i][j]-a[i][j];
            if(tot>m1[k]){
                m2[k]=m1[k];
                m1[k]=tot;
            }else if(tot>m2[k])m2[k]=tot;
        }
    }
    int ans=INF;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int k=i+j;
            int tot=s1[i][j]+s2[i][j]-a[i][j];
            int no=(tot==m1[k])?m2[k]:m1[k];
            int yes=tot-2*a[i][j];
            ans=min(ans,max(yes,no));
        }
    }
    cout<<ans<<'\n';
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin>>t;
    while(t--)solve();
    return 0;
}
相关推荐
江畔柳前堤7 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore8 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考10 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX10 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面11 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号11 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽11 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI11 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者13 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者13 小时前
【征程6】校准量化中HistogramObserver解析
算法