80求助
查看原帖
80求助
511959
_Weslie_楼主2024/7/19 08:48
#include<bits/stdc++.h>
#define int long long
using namespace std;
long long sum[1005][1005];
int n,m;
long long a[1005][1005],dp[1005][1005],pre3,pre4,t,s;
long long read() {
	int f=1,x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=x*10+ch-'0';
		ch=getchar();
	}
	return f*x;
}
long long maxx(long long _,long long __) {
	if(_>__)return _;
	return __;
}
signed main() {
//	freopen("genshin.txt","r",stdin);
	n=read();
	m=read();
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			a[i][j]=read();
			dp[j][i]=-1145141919810;
		}
	}
	for(int i=1; i<=m; i++) {
		for(int j=1; j<=n; j++) {
			sum[i][j]=sum[i][j-1]+a[j][i];
		}
	}
	for(int i=1; i<=n; i++) {
		dp[1][i]=sum[1][i];
	}
	if(n<=300&&m<=300) {
		for(int i=2; i<=m; i++) {
			for(int j=1; j<=n; j++) {
				for(int k=1; k<=j; k++) {
					dp[i][k]=maxx(dp[i-1][j]+sum[i][j]-sum[i][k-1],dp[i][k]);
				}
				for(int k=j+1; k<=n; k++) {
					dp[i][k]=maxx(dp[i-1][j]-sum[i][j-1]+sum[i][k],dp[i][k]);
				}
			}
		}
	}
	else {
		for(int i=2; i<=m; i++) {
			pre3=-1145141919810;
			pre4=-1145141919810;
			for(int j=1; j<=n; j++) {
				if(dp[i-1][j]+sum[i][j]>pre3) {
					pre3=dp[i-1][j]+sum[i][j];
					t=j;
				}
				if(dp[i-1][j]-sum[i][j-1]>pre4) {
					pre4=dp[i-1][j]-sum[i][j-1];
					s=j;
				}
			}
			for(int k=1; k<=t; k++) {
				dp[i][k]=maxx(pre3-sum[i][k-1],dp[i][k]);
			}
			for(int k=s; k<=n; k++) {
				dp[i][k]=maxx(pre4+sum[i][k],dp[i][k]);
			}
		}
	}

	printf("%lld",dp[m][n]);
	return 0;
}

#17 #18 #20 #21 WA

if(n<=300&&m<=300) 后跟着 n2mn^2m 的暴力。

else 后跟着 nmnm 的正解。

2024/7/19 08:48
加载中...