why E wa4玄关
  • 板块学术版
  • 楼主xu_zhihao
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/7/19 22:26
  • 上次更新2025/7/20 14:36:43
查看原帖
why E wa4玄关
1063855
xu_zhihao楼主2025/7/19 22:26
#include<bits/stdc++.h>
#define int long long
using namespace std;
int p[500010];
int sum[500010];
signed main(){
	int h,w;
	cin>>h>>w;
	int a[h+10][w+10],dp[h+10][w+10],g[h+10][w+10];
	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=h+w-1;i++){
		cin>>p[i];
	}
	for(int i=0;i<=h;i++){
		for(int j=0;j<=w;j++){
			dp[i][j]=0;
			g[i][j]=0;
		}
	}
	sum[0]=0;
	for(int i=1;i<=h+w-1;i++){
		sum[i]=sum[i-1]+p[i-1];
	}
	dp[1][1]=p[1]-a[1][1];
	g[1][1]=a[1][1];
	if(h==1 && w==1){
		cout<<max(0ll,dp[1][1]);
		return 0;
	}
	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++){
			if(i==1 && j==1)continue;
			int m1=1e18,s1=-1;
			int m2=1e18,s2=-1;
			int k=i+j-1;
			if(j>1){
				int a1=g[i][j-1]+a[i][j];
				int c=p[k]+sum[k]-a1;
				int ma=max(dp[i][j-1],c);
				m1=ma;
				s1=a1;
			}
			
			if(i>1){
				int a1=g[i-1][j]+a[i][j];
				int c=p[k]+sum[k]-a1;
				int ma=max(dp[i-1][j],c);
				m2=ma;
				s2=a1;
			}
			if(i>1 && j>1){
				if(m1<m2){
					dp[i][j]=m1;
					g[i][j]=s1;
				}
				else if(m2<m1){
					dp[i][j]=m2;
					g[i][j]=s2;
				}
				else{
					dp[i][j]=m1;
					g[i][j]=max(s1,s2);
				}
			}
			else if(j>1){
				dp[i][j]=m1;
				g[i][j]=s1;
			}
			else if(i>1){
				dp[i][j]=m2;
				g[i][j]=s2;
			}
		}
	}
	int ans=dp[h][w];
	ans=max(ans,0ll);
	cout<<ans<<endl;
	return 0;
}
2025/7/19 22:26
加载中...