以反对角线的形式遍历迷宫,分层在bfs上跑dp,每一层为一个时间点,最多不会超过n+m层
#include <bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
using namespace std;
int n,m,t,x,y,v,ans;
struct node{int val,t;};
node a[1010][1010];
int f[1010][1010];
struct Node{int x,y,t;};
queue<Node>q;
signed main() {
	IOS
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            cin>>a[i][j].val;
            a[i][j].t=1e8;
        }
    cin>>t;
    for(int i=1;i<=t;i++){
        cin>>x>>y>>v;
        a[x][y].t=v;   
    }
    q.push({1,1,1});
    f[1][1]=a[1][1].val;
    while(q.size()){
        auto temp=q.front();q.pop();
        if(temp.t>n+m)break;   
        if(a[temp.x+1][temp.y].t>temp.t&&temp.x+1>=1&&temp.x+1<=n&&temp.y>=1&&temp.y<=m){
            if(f[temp.x][temp.y]+a[temp.x+1][temp.y].val>f[temp.x+1][temp.y]){
                            //剪枝,避免无效状态进入队列
                f[temp.x+1][temp.y]=f[temp.x][temp.y]+a[temp.x+1][temp.y].val;
                q.push({temp.x+1,temp.y,temp.t+1});
            }
        }
        if(a[temp.x][temp.y+1].t>temp.t&&temp.x>=1&&temp.x<=n&&temp.y+1>=1&&temp.y+1<=m){
            if( f[temp.x][temp.y]+a[temp.x][temp.y+1].val>f[temp.x][temp.y+1]){
                            //剪枝,避免无效状态进入队列
                f[temp.x][temp.y+1]=f[temp.x][temp.y]+a[temp.x][temp.y+1].val;
                q.push({temp.x,temp.y+1,temp.t+1});
            }
        }
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
           ans=max(ans,f[i][j]);
    cout<<ans;
    return 0;
}