如题,人都调没了。
思路:先是用 0 金币跑一遍,然后根据最佳路径中的最小值取负。
#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,l,r) for(int i=l;i>=r;i--)
#define int long long
#define x first
#define y second
typedef long double ld;
typedef pair<int,int> PII;
constexpr int N=500010,mod=998244353;
int n,p[N];
int dfs(vector<vector<pair<int,int>>>& pr,vector<vector<int>>& dp,int x,int y){
if(!x&&!y) return 1e18;
auto [a,b]=pr[x][y];
return min(dp[x][y],dfs(pr,dp,a,b));
}
signed main(){
int T=1;
while(T--){
int n,m;cin>>n>>m;
vector<vector<int>> a(n+5,vector<int>(m+5,0)),dp(n+5,vector<int>(m+5,-1e18));
vector<vector<pair<int,int>>>pre(n+5,vector<pair<int,int>>(m+5,{0,0}));
rep(i,1,n) rep(j,1,m) cin>>a[i][j];
rep(i,1,n+m-1) cin>>p[i];
dp[1][1]=a[1][1]-p[1];
rep(i,1,n) rep(j,1,m) if(i!=1||j!=1){
if(dp[i-1][j]>dp[i][j-1]) pre[i][j]={i-1,j};
else pre[i][j]={i,j-1};
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+a[i][j]-p[i+j-1];
}
cout<<max(-dfs(pre,dp,n,m),0ll)<<"\n";
}
}