#include<iostream>
#include<vector>
using namespace std;
#define int long long
vector<int> a[200005],dp[200005],dp2[200005];
int p[400005],s[400005];
signed main(){
int h,w;
cin>>h>>w;
for(int i=0;i<=w;i++){
a[0].push_back(0);
}
for(int i=1;i<=h;i++){
a[i].push_back(0);
for(int j=1;j<=w;j++){
int x;
cin>>x;
a[i].push_back(x);
}
}
for(int i=1;i<=h+w-1;i++){
cin>>p[i];
s[i]=s[i-1]+p[i];
}
int cnt=0;
for(int i=0;i<=w;i++){
dp[0].push_back(0);
dp2[0].push_back(1e18);
}
for(int i=1;i<=h;i++){
dp[i].push_back(0);
dp2[i].push_back(1e18);
for(int j=1;j<=w;j++){
dp[i].push_back(max(dp[i-1][j],dp[i][j-1])+a[i][j]);
if(i==1 && j==1) dp2[i].push_back(0);
else dp2[i].push_back(min(dp2[i-1][j],dp2[i][j-1]));
if(s[i+j-1]>dp[i][j]+dp2[i][j]) dp2[i][j]+=s[i+j-1]-dp[i][j]-dp2[i][j];
}
}
cout<<dp2[h][w];
return 0;
}
其中 dpi,j 表示走到 (i,j) 时获得的最大金币数,dp2i,j 表示走到 (i,j) 需要的最小初始钱数