NOIP2000 方格取数
2015-10-24 21:22
274 查看
题目描述:
某脑残A按横或纵坐标递增(不减)的方式从(1,1)=第一行第一列,在n*n的矩阵中走过2*n-1个方格到达(n,n),而且走两遍;
找出一种行走方式使得其走过的方格权和最大,输出最大权和;原题
样例:
8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
output:
67
样例二(补充):
3
1 1 1
1 2 9
1 3 1
3 1 1
3 2 9
3 3 1
0 0 0
output:
22
题解:
多线程动态规划;
啊,这是什么?
其实我也不知道,但这一题的想法是想象为两个人一起走,求最大权和;
状态 s [ x1 ] [ y1 ] [ x2 ] [ y2 ];
表示 A走到( x1,y1 )
B走到( x2,y2) 时 能获得的最大权和;
转移很简单:
A,B分别走 (下,下) , (右,下),(下,右),(右,右) 时的最大值加上A,B当前位置的权;
若A,B同位置 s [ x1 ] [ y1 ] [ x1==x2 ] [ y1==y2 ] = max(s [ x1 ] [ y1+1 ] [ x2 ] [ y2+1 ],
s [ x1+1 ] [ y1 ] [ x2 ] [ y2+1 ].
s [ x1 ] [ y1+1 ] [ x2+1 ] [ y2 ],
s [ x1+1 ] [ y2 ] [ x2+1 ] [ y2 ],) + map [ x1
] [ y1 ];
若A,B不同位置 s [ x1 ] [ y1 ] [ x1 ] [ y1 ] = max(s [ x1 ] [ y1+1 ] [ x2 ] [ y2+1 ],
s [ x1+1 ] [ y1 ] [ x2 ] [ y2+1 ].
s [ x1 ] [ y1+1 ] [ x2+1 ] [ y2 ],
s [ x1+1 ] [ y2 ] [ x2+1 ] [ y2 ],) + map [ x1 ] [ y1 ]+map [ x2 ] [ x2 ];
啊A,B是一起走的?
那么就有 x1 + y1 = x2 + y2
这样,y2的一维就多余了
我们只需要写 y2 = x1 + y1 -x2并且硬生生地从方程中将y2删去即可
这样就是O(n^3)对于n<=10,这就是0ms
好,现在想多线程是什么......
就是两个人一起走......
NOI管道取珠也是这样的想法:
求ai^2
可以想象为两个人一起取,计算到达同一末状态时的总取法数;
一样的想法,同时也是一样的优化,又有一维可以直接推,又由O(n^4)->O(n^3)
某脑残A按横或纵坐标递增(不减)的方式从(1,1)=第一行第一列,在n*n的矩阵中走过2*n-1个方格到达(n,n),而且走两遍;
找出一种行走方式使得其走过的方格权和最大,输出最大权和;原题
样例:
8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
output:
67
样例二(补充):
3
1 1 1
1 2 9
1 3 1
3 1 1
3 2 9
3 3 1
0 0 0
output:
22
题解:
多线程动态规划;
啊,这是什么?
其实我也不知道,但这一题的想法是想象为两个人一起走,求最大权和;
状态 s [ x1 ] [ y1 ] [ x2 ] [ y2 ];
表示 A走到( x1,y1 )
B走到( x2,y2) 时 能获得的最大权和;
转移很简单:
A,B分别走 (下,下) , (右,下),(下,右),(右,右) 时的最大值加上A,B当前位置的权;
若A,B同位置 s [ x1 ] [ y1 ] [ x1==x2 ] [ y1==y2 ] = max(s [ x1 ] [ y1+1 ] [ x2 ] [ y2+1 ],
s [ x1+1 ] [ y1 ] [ x2 ] [ y2+1 ].
s [ x1 ] [ y1+1 ] [ x2+1 ] [ y2 ],
s [ x1+1 ] [ y2 ] [ x2+1 ] [ y2 ],) + map [ x1
] [ y1 ];
若A,B不同位置 s [ x1 ] [ y1 ] [ x1 ] [ y1 ] = max(s [ x1 ] [ y1+1 ] [ x2 ] [ y2+1 ],
s [ x1+1 ] [ y1 ] [ x2 ] [ y2+1 ].
s [ x1 ] [ y1+1 ] [ x2+1 ] [ y2 ],
s [ x1+1 ] [ y2 ] [ x2+1 ] [ y2 ],) + map [ x1 ] [ y1 ]+map [ x2 ] [ x2 ];
啊A,B是一起走的?
那么就有 x1 + y1 = x2 + y2
这样,y2的一维就多余了
我们只需要写 y2 = x1 + y1 -x2并且硬生生地从方程中将y2删去即可
这样就是O(n^3)对于n<=10,这就是0ms
好,现在想多线程是什么......
就是两个人一起走......
NOI管道取珠也是这样的想法:
求ai^2
可以想象为两个人一起取,计算到达同一末状态时的总取法数;
一样的想法,同时也是一样的优化,又有一维可以直接推,又由O(n^4)->O(n^3)
相关文章推荐
- 动态显示文件名之 Intent和Menu
- POJ3581:Sequence(后缀数组)
- (算法)求表达式(含括号)的值
- 今天你学到了啥?
- ubuntu输入密码后无法进入图形桌面
- 使用 Jni 调用 Dll 的实现JAVA在cmd控制台刷屏
- wordpress 后台取消显示custom fields(remove_meta_box)
- Android开发-控件
- Windows下如何查看被占用的端口号及如何释放被占用的端口号
- 2015-10-21 C#1
- ACM学习历程—HDU 5073 Galaxy(数学)
- 夺命雷公狗---无限级分类NO4
- HDU3584Cube(三维树状数组)
- 1024杂项1
- 夺命雷公狗---无限级分类NO3
- 项目实训--物流管理系统之调度中心
- argument和parameter的区别
- 阅读优秀代码是提高开发人员修为的一种捷径
- OC单例概念以及样例
- 应用于cookie