方格取数求助
  • 板块学术版
  • 楼主hw1901郑钰凡
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/8/10 11:22
  • 上次更新2023/11/4 11:12:48
查看原帖
方格取数求助
304869
hw1901郑钰凡楼主2021/8/10 11:22

P7074 样例都能过

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1001][1001],dp[1001][1001];
int up[1001][1001],down[1001][1001];
int n,m;
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	dp[1][1]=up[1][1]=down[1][1]=a[1][1];
	for(int i=2;i<=n;i++)
		dp[i][1]=up[i][1]=down[i][1]=dp[i-1][1]+a[i][1];
	for(int j=2;j<=m;j++){
		down[1][j]=down[1][j-1]+a[1][j];
		up[n][j]=up[n][j-1]+a[n][j];
	}
	for(int j=2;j<m;j++){
		for(int i=2;i<=n;i++)
			down[i][j]=max(down[i-1][j],dp[i][j-1])+a[i][j];
		for(int i=n-1;i>=1;i--)
			up[i][j]=max(up[i+1][j],dp[i][j-1])+a[i][j];
		for(int i=1;i<=n;i++)
			dp[i][j]=max(up[i][j],down[i][j]);
	}
	dp[1][m]=dp[1][m-1]+a[1][m];
	for(int i=2;i<=n;i++)
		dp[i][m]=max(dp[i][m-1],dp[i-1][m])+a[i][m]; 
	/*
	cout<<endl;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)
			cout<<down[i][j]<<" ";
		cout<<endl;
	}
	cout<<endl;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)
			cout<<up[i][j]<<" ";
		cout<<endl;
	}
	cout<<endl;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)
			cout<<dp[i][j]<<" ";
		cout<<endl;
	}
	cout<<endl;//调试 
	*/
	cout<<dp[n][m]<<endl;
	return 0;
}
2021/8/10 11:22
加载中...