Codeforces 429B - Working out
思路:从四个角递推,然后暴力每个点,有两种情况:
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) const int N=1e3+5; int a[N][N]; ll dp[4][N][N]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) cin>>a[i][j]; } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++)dp[0][i][j]=a[i][j]+max(dp[0][i-1][j],dp[0][i][j-1]); } for(int i=n;i>=1;i--) { for(int j=1;j<=m;j++)dp[1][i][j]=a[i][j]+max(dp[1][i][j-1],dp[1][i+1][j]); } for(int i=n;i>=1;i--) { for(int j=m;j>=1;j--)dp[2][i][j]=a[i][j]+max(dp[2][i+1][j],dp[2][i][j+1]); } for(int i=1;i<=n;i++) { for(int j=m;j>=1;j--)dp[3][i][j]=a[i][j]+max(dp[3][i-1][j],dp[3][i][j+1]); } ll ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(j-1>=1&&i+1<=n&&j+1<=m&&i-1>=1)ans=max(ans,dp[0][i][j-1]+dp[1][i+1][j]+dp[2][i][j+1]+dp[3][i-1][j]); if(i-1>=1&&j-1>=1&&i+1<=n&&j+1<=m)ans=max(ans,dp[0][i-1][j]+dp[1][i][j-1]+dp[2][i+1][j]+dp[3][i][j+1]); } } cout<<ans<<endl; return 0; }