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
- CodeForces 429B()
- codeforces 429B
- Codeforces 429B
- CodeForces 429B
- codeforces 429B
- [dp] Codeforces 429B B. Working out
- codeforces 429B B. Working out(dp)
- dp Codeforces 429B B. Working out
- Codeforces 429B B. Working out dp
- CodeForces 429B B.Working out
- Codeforces 429B B. Working out
- Codeforces 429B Working out
- CodeForces 429B Working out
- CodeForces 429B Working out
- Codeforces Round#429 B-Godesend
- Codeforces Round #429 (Div2) B
- Codeforces-429-2-B Godsend
- codeforces B
- 中介模式
- HDU5916-Harmonic Value Description
- FIDDLER的使用方法及技巧总结[连载3]---FIDDLER使用技巧及方法
- hihocoder 1103 数位dp+记忆化搜索
- 流操作
- codeforces 429B
- 组合模式
- 欢迎使用CSDN-markdown编辑器
- 图论基础
- 这是权威的JDK与JRE的联系与区别
- java线程学习知识点
- OC__part11.1
- 各个算法(pascal)的时间复杂度
- 面向对象程序设计上机练习七(类和对象)