Codevs1169 传纸条
2015-08-24 11:21
471 查看
首先,必须吐槽的是,这题,经过了各种对拍加上截标准程序片段与本人程序互换以后,仍然WA,最后搞得我把整个四维的f数组都输出了,结果发现,在某一组小数据中,我的f数组总与标准程序的f数组差2。于是乎,我便去找输入了,于是乎,i从1循环到m打成了n……还我的两个半小时!(怨念发作中……)
好了,言归正传,题目大意是,从(1,1)走到(m,n)再走回去,途中不经过重复的点累加路径权值的最大值。
思路:显然属于棋盘型DP。我们记f[i1][j1][i2][j2]表示出发时到(i1,j1),回来时的反向路径(也就是说,我们从终点回到起点的路径可以用从起点到终点的路径来表示,即第二条路到达(i2,j2))到达(i2,j2)时的权值和的最大值。那么,状态转移方程显然就是f[i1][j1][i2][j2]=max{ f[i1][j1-1][i2-1][j2],f[i1][j1-1][i2][j2-1],f[i1-1][j1][i2-1][j2],f[i1-1][j1][i2][j2-1] }+a[i1][j1]+a[i2][j2]。如果两个点重合,只需加上其中一个点的权值,表示仅能经过一次。
当然,有两种将四维优化至三维的方法。第一种是考虑到两个人走的总步数都相等,利用f[k][i][j]表示第一个人在一个方向上走了i步,另外一个人在相同方向上走了j步的最大值,这种详情请见三维的优化方法之一;第二种是以斜线为阶段,这种详情请见三维的优化方法之二。
代码如下:
好了,言归正传,题目大意是,从(1,1)走到(m,n)再走回去,途中不经过重复的点累加路径权值的最大值。
思路:显然属于棋盘型DP。我们记f[i1][j1][i2][j2]表示出发时到(i1,j1),回来时的反向路径(也就是说,我们从终点回到起点的路径可以用从起点到终点的路径来表示,即第二条路到达(i2,j2))到达(i2,j2)时的权值和的最大值。那么,状态转移方程显然就是f[i1][j1][i2][j2]=max{ f[i1][j1-1][i2-1][j2],f[i1][j1-1][i2][j2-1],f[i1-1][j1][i2-1][j2],f[i1-1][j1][i2][j2-1] }+a[i1][j1]+a[i2][j2]。如果两个点重合,只需加上其中一个点的权值,表示仅能经过一次。
当然,有两种将四维优化至三维的方法。第一种是考虑到两个人走的总步数都相等,利用f[k][i][j]表示第一个人在一个方向上走了i步,另外一个人在相同方向上走了j步的最大值,这种详情请见三维的优化方法之一;第二种是以斜线为阶段,这种详情请见三维的优化方法之二。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,f[55][55][55][55]; int a[55][55]; void init() { scanf("%d%d",&m,&n); for (int i=1;i<=m;++i) for (int j=1;j<=n;++j) scanf("%d",&a[i][j]); memset(f,0,sizeof(f)); } void dp() { int i1,j1,i2,j2; for (i1=1;i1<=m;++i1) for (j1=1;j1<=n;++j1) for (i2=1;i2<=m;++i2) for (j2=1;j2<=n;++j2) { int tmp=0; tmp=max(max(f[i1][j1-1][i2-1][j2],f[i1][j1-1][i2][j2-1]), max(f[i1-1][j1][i2-1][j2],f[i1-1][j1][i2][j2-1])); if (i1==i2 && j1==j2) f[i1][j1][i2][j2]=a[i1][j1]+tmp; else f[i1][j1][i2][j2]=a[i1][j1]+a[i2][j2]+tmp; } printf("%d",f[m] [m] ); } int main() { init(); dp(); return 0; }
相关文章推荐
- Cortex-M3处理器的舞台
- 饥饿的牛 解题报告
- ajax如何实现页面局部跳转与结果返回
- Logback.xml模板
- JavaWeb笔记——Jsp的指令、内置对象和动作标签
- JavaWeb笔记——Jsp的指令、内置对象和动作标签
- inittab脚本启动解析
- <c:if test="value ne, eq, lt, gt,...."> 用法
- 读取excel数据并保存为xml
- STM32官方固件库简介
- solrcloud5.2.1视频教程
- onTouchEvent事件冲突
- WebStorm注册码
- easyui 中 OnClickRow 的使用案例
- 透明的dialog
- 判断整数、判断邮箱、判断手机号码、判断邮政编码、判断中文
- UVa 1614:Hell on the Markets(贪心)
- 将DataTable转换成EasyUITree的json格式 ---四级树
- MockupBuilder
- 简单易学的机器学习算法——协同过滤推荐算法(2)