codeforces 429B

来源:互联网 发布:安卓收费软件 编辑:程序博客网 时间:2024/06/14 08:11

  把四个角到每个格子的最大花费预处理,然后枚举每个格子,注意边缘不需要枚举,因为如果相遇点在边缘必定不会满足只有一个点相遇的前提。

AC代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1004;int dp[maxn][maxn][4]; //从四个角出发int a[maxn][maxn];int main(){    int n,m;    scanf("%d%d",&n,&m);    memset(dp,0,sizeof(dp));    for(int i=1;i<=n;++i)        for(int j=1;j<=m;++j)            scanf("%d",&a[i][j]);    for(int i=1;i<=n;++i)        for(int j=1;j<=m;++j){            dp[i][j][0]=max(dp[i-1][j][0],dp[i][j-1][0])+a[i][j]; //左上        }    for(int i=1;i<=n;++i)        for(int j=m;j>=1;--j){            dp[i][j][1]=max(dp[i-1][j][1],dp[i][j+1][1])+a[i][j]; //右上        }    for(int i=n;i>=1;--i)        for(int j=1;j<=m;++j){            dp[i][j][2]=max(dp[i+1][j][2],dp[i][j-1][2])+a[i][j]; //左下        }    for(int i=n;i>=1;--i)        for(int j=m;j>=1;--j){            dp[i][j][3]=max(dp[i+1][j][3],dp[i][j+1][3])+a[i][j]; //右下        }    //枚举相遇点    int ans=0;    for(int i=2;i<n;++i)        for(int j=2;j<m;++j){            ans=max(ans,dp[i][j-1][0]+dp[i][j+1][3]+dp[i+1][j][2]+dp[i-1][j][1]);            ans=max(ans,dp[i-1][j][0]+dp[i+1][j][3]+dp[i][j-1][2]+dp[i][j+1][1]);        }    printf("%d\n",ans);    return 0;}

如有不当之处欢迎指出!


0 0
原创粉丝点击