题目描述:
某脑残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)