51Nod 1084 DP+滚动数组
来源:互联网 发布:手机免费淘宝p图软件 编辑:程序博客网 时间:2024/06/03 08:22
题目链接
题意:(经转化)
有一个
思路:
类似于
考虑动态规划
定义
因每个时刻只有两个固定的方向,故横纵坐标之和一定等于时刻t。
故第一个人的坐标为
第二个人的坐标为
因为对于第一个人,前一个状态有两种可能,第二个人也是一样。故一共有四个转移方程。取
因为两个人同时出发,一个点被两个人经过的时刻一定相同,故
当
否则,Add为(i,t-i)和(j,t-j)两个点的值的和。
又因为每一个时刻的状态只与上一个时刻有关,故第一维可以滚动优化。
代码:
#include<cstdio>#include<algorithm>using namespace std;const int A = 200 + 10;int dp[2][A][A],maze[A][A];int n,m;int main(){ scanf("%d%d",&m,&n); for(int i=0 ;i<n ;i++) for(int j=0 ;j<m ;j++) scanf("%d",&maze[i][j]); dp[0][0][0] = maze[0][0]; for(int t=1 ;t<=n+m-2 ;t++){ int now = t&1; for(int i=0 ;i<n ;i++){ int x1 = i,y1 = t-i; if(x1<0 || x1>=n || y1<0 || y1>=m) continue; for(int j=i ;j<n ;j++){ int x2 = j,y2 = t-j; if(x2<0 || x2>=n || y2<0 || y2>=m) continue; int add = 0; if(x1 == x2) add = maze[x1][y1]; else add = maze[x1][y1] + maze[x2][y2]; dp[now][x1][x2] = max(dp[now][x1][x2],dp[now^1][x1][x2] + add); if(x1>0) dp[now][x1][x2] = max(dp[now][x1][x2],dp[now^1][x1-1][x2] + add); if(x2>0) dp[now][x1][x2] = max(dp[now][x1][x2],dp[now^1][x1][x2-1] + add); if(x1>0 && x2>0) dp[now][x1][x2] = max(dp[now][x1][x2],dp[now^1][x1-1][x2-1] + add); } } } printf("%d\n",dp[(n+m-2)&1][n-1][n-1]); return 0;}
阅读全文
0 0
- 51Nod 1084 DP+滚动数组
- 51Nod 编辑距离 DP+滚动数组
- 51nod 1043 幸运号码【dp+滚动数组】
- 51nod 1270 数组的最大代价【思维+Dp+滚动数组优化】
- 51nod-1043 幸运号码(滚动数组)
- 51 nod 1732 51nod婚姻介绍所(后缀数组||DP)
- 51nod 1294 修改数组 dp
- poj1159 dp 滚动数组
- poj1159(滚动数组 + DP)
- codeforces570E-DP+滚动数组
- DP+滚动数组
- DP与滚动数组
- 51nod 1270 数组的最大代价(DP)
- 51nod 循环数组最大子段和 (dp)
- 51nod 1050 循环数组最大子段和 dp
- 51nod 1270 数组的最大代价 dp
- 【51Nod】1270 - 数组的最大代价(dp)
- 51nod 1270 数组的最大代价(DP)
- List集合对象去重-项目实战
- 未来监护人:FCC专员正在努力推迟网络中立投票
- 背包问题简单示例
- JavaScript面向对象(4)——最佳继承模式(深拷贝、多重继承、构造器借用、组合寄生式继承)
- angularJS项目前端后端分离,IDEA中开发部署
- 51Nod 1084 DP+滚动数组
- 网络IO模型
- Mysql-增删改查2
- ubuntu下Python导入自定义模块的方法
- DNS术语,组件和概念介绍
- 数据库链接步骤及详解
- lua 元表
- spring--事务
- 北京市卫星地图离线包下载