Codeforce 429B(递推)
2016-04-18 22:54
218 查看
链接:点击打开链接
题意:有两个人一个从左上角走到右下角一个,一个从左下角走到右上角,两个人只能相遇一回并且相遇的点的价值都不取,问两个人价值和最大是多少
代码:
题意:有两个人一个从左上角走到右下角一个,一个从左下角走到右上角,两个人只能相遇一回并且相遇的点的价值都不取,问两个人价值和最大是多少
代码:
#include <math.h> #include <vector> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; const long long INF=0x3f3f3f3f; long long a[1005][1005],dp[1005][1005][5]; int main(){ long long i,j,k,n,m,ans,tmp; while(scanf("%I64d%I64d",&n,&m)!=EOF){ ans=0; memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&a[i][j]); for(i=n;i>=1;i--) //向四个角递推 for(j=m;j>=1;j--) dp[i][j][0]=max(dp[i+1][j][0],dp[i][j+1][0])+a[i][j]; for(i=n;i>=1;i--) for(j=1;j<=m;j++) dp[i][j][1]=max(dp[i][j-1][1],dp[i+1][j][1])+a[i][j]; for(i=1;i<=n;i++) for(j=1;j<=m;j++) dp[i][j][2]=max(dp[i-1][j][2],dp[i][j-1][2])+a[i][j]; for(i=1;i<=n;i++) for(j=m;j>=1;j--) dp[i][j][3]=max(dp[i-1][j][3],dp[i][j+1][3])+a[i][j]; for(i=2;i<=n-1;i++) for(j=2;j<=m-1;j++){ //不能再边界上相遇,否则不止会相遇一次 tmp=dp[i+1][j][0]+dp[i][j-1][1]+dp[i-1][j][2]+dp[i][j+1][3]; ans=max(ans,tmp); tmp=dp[i][j+1][0]+dp[i+1][j][1]+dp[i][j-1][2]+dp[i-1][j][3]; ans=max(ans,tmp); } printf("%I64d\n",ans); } return 0; }
相关文章推荐
- Linux基础: 系统加载过程和运行级别含义
- SharePreferences类的运用
- CodeForces 304C
- C++中引用与指针的区别(详细介绍)
- hdu3555 模板化数位dp
- redhat6.5双网卡bond
- cmake使用多线程
- 计算几何之基础篇
- 初学几种设计模式的理解与体会
- 面试题05:求子数组的最大和
- 小Po记录
- iOS开发- 拨打电话总结
- arm编程,关于函数调用形参实参在通用寄存器和栈帧里的对应关系。用汇编透视c语法操作
- 有关java并发程序同步概念的全部意义
- 同步异步阻塞非阻塞
- 共享内存
- ZOJ 3870 Team Formation 第12届浙江省省赛B题 [位运算+思维]【数学】
- Mactype与VirtualBox的兼容性问题
- 字符串-加密与解密
- make出现遗漏分隔符是必须要明白的小知识以及解决之道