早教吧作业答案频道 -->其他-->
下面是一个例子12345161718196152425207142322218131211109一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.在上面的例子中,一条可滑行的滑坡为24-17-16-1.当然25-24-23-
题目详情
下面是一个例子
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.在上面的例子中,一条可滑行的滑坡为24-17-16-1.当然25-24-23-...-3-2-1更长.事实上,这是最长的一条.
01.#include
02.#include
03.#include
04.usingnamespacestd;
05.intopt[102][102];
06.intmap[102][102];
07.intdir[4][2] ={-1,0,1,0,0,-1,0,1};
08.intr,c;
09.intw(inta,intb)
10.{
11.inti;
12.if(ac)return0;
13.if(opt[a][b] = 0) returnopt[a][b];
14.else
15.{
16.for(i=0;i opt[a][b] )
19.opt[a][b]=w(a+dir[i][1],b+dir[i][0]);
20.return ++opt[a][b];
21.}
22.}
23.intmain(void)
24.{
25.intmax,i,j;
26.intn;
27.scanf("%d",&n);
28.while(n--)
29.{
30.scanf("%d%d",&r,&c);
31.for( i = 1 ; i
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.在上面的例子中,一条可滑行的滑坡为24-17-16-1.当然25-24-23-...-3-2-1更长.事实上,这是最长的一条.
01.#include
02.#include
03.#include
04.usingnamespacestd;
05.intopt[102][102];
06.intmap[102][102];
07.intdir[4][2] ={-1,0,1,0,0,-1,0,1};
08.intr,c;
09.intw(inta,intb)
10.{
11.inti;
12.if(ac)return0;
13.if(opt[a][b] = 0) returnopt[a][b];
14.else
15.{
16.for(i=0;i opt[a][b] )
19.opt[a][b]=w(a+dir[i][1],b+dir[i][0]);
20.return ++opt[a][b];
21.}
22.}
23.intmain(void)
24.{
25.intmax,i,j;
26.intn;
27.scanf("%d",&n);
28.while(n--)
29.{
30.scanf("%d%d",&r,&c);
31.for( i = 1 ; i
▼优质解答
答案和解析
通过动态规划来寻找一条最长的路线的长度
假设f(r, c)表示现在处在第r行第c列时能够进行的最长路线的长度
那么f(r, c) = 1 + max(f(r-1, c), f(r+1, c), f(r, c-1), f(r, c+1)) 即1加上四个方向的最大长度
根据上面的定义可以写出一个backtracking算法解决,这里用动态规划来提高效率
上面算法的数组opt存放的f(r, c),首先其初始化为0, 34-35行
13行检查是否已经计算过f(a, b),有则可直接返回
14-24行即根据上面讲的计算f(r, c)的方法计算f(a, b)
dir 是一个lookup table用来存放四个方向dr, dc值.
16行的for循环检查四个方向
17行确定检查的地点的值是小于当前地点的值(根据滑动要求)
18,19行就是求四个方向的最大值,并将它存储到opt[a][b]中
20行加一得到最后的值
这个函数终止可以从当前点的值看出来,每一次调用,当前点的值都减小,可以从17行看出
最终a,b小于0,函数返回
上面的解释不好理解可以将这个问题看得更一般一些,将想成一个search problem来理解
那么这个函数实际上就是一个算法来找一个state到另一个state的最大路线的长度.
假设f(r, c)表示现在处在第r行第c列时能够进行的最长路线的长度
那么f(r, c) = 1 + max(f(r-1, c), f(r+1, c), f(r, c-1), f(r, c+1)) 即1加上四个方向的最大长度
根据上面的定义可以写出一个backtracking算法解决,这里用动态规划来提高效率
上面算法的数组opt存放的f(r, c),首先其初始化为0, 34-35行
13行检查是否已经计算过f(a, b),有则可直接返回
14-24行即根据上面讲的计算f(r, c)的方法计算f(a, b)
dir 是一个lookup table用来存放四个方向dr, dc值.
16行的for循环检查四个方向
17行确定检查的地点的值是小于当前地点的值(根据滑动要求)
18,19行就是求四个方向的最大值,并将它存储到opt[a][b]中
20行加一得到最后的值
这个函数终止可以从当前点的值看出来,每一次调用,当前点的值都减小,可以从17行看出
最终a,b小于0,函数返回
上面的解释不好理解可以将这个问题看得更一般一些,将想成一个search problem来理解
那么这个函数实际上就是一个算法来找一个state到另一个state的最大路线的长度.
看了 下面是一个例子1234516...的网友还看了以下:
函数f(x)=Asin(ωx+φ)(A>0,ω>0,0≤φ<2π)在R上的部分图像如图所示,则f( 2020-04-12 …
已知由样本数据点集{(xi,yi)|i=1,2,……,n},求得的回归直线方程为为^y=1.23x 2020-04-27 …
写出下列各点关于已知直线的对称点.(3,2)关于直线x=1的对称点为,关于直线y=-1的对称点为; 2020-05-02 …
(1)顶点A(0,6)离心率为1.5,求双曲线标准方程!(1)顶点A(0,6)离心率为1.5,(2 2020-05-13 …
已知直线A,B之间为5米,A,B的中间一点到弧直线距离为1.5米,求面积,求弧长.求半径?面积的公 2020-05-14 …
已知将电荷量为2.0×10-7C的正点电荷从电场中的M点移到N点时,静电力做功为5.0×10-5J 2020-05-16 …
经过点A(1,2)作以点0(3,5)为圆心,半径为1.5的圆的切线,求切点的坐标 2020-05-19 …
3人独立地佢破译一个密码,他们能译出的概率分别为1/5,1/3,1/4,问能将此密码译出的概率是多 2020-05-20 …
在电场中把电荷量为2.0×10-9C的正电荷从A点移到B点,静电力做功为-1.5×10-7J,再把 2020-06-26 …
数学二次函数(1)y=ax2+bx+c图像与x轴交于点A,B并经过点C求二次函数解析式要求:点A, 2020-07-15 …