ewa*6 求 hack
  • 板块学术版
  • 楼主dg114514
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/7/19 21:57
  • 上次更新2025/7/20 13:40:37
查看原帖
ewa*6 求 hack
1373205
dg114514楼主2025/7/19 21:57

如题,人都调没了。
思路:先是用 00 金币跑一遍,然后根据最佳路径中的最小值取负。

#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";
	}
}

2025/7/19 21:57
加载中...