记忆化搜索--HDU 1428
此题大意讲的是从起点到终点,要求若从A到B,则需保证A到终点的时间比B到终点时间要长。由于有此要求,必然想到动态规划记录其最短路线的状态,但传统动态规划却解决不了。
故采用记忆化搜索,记忆化搜索=搜索形式+动态规划思想
1 #include<iostream>
2 #include<cstring>
3 #include<queue>
4 using namespace std;
5 int map[51][51],m[51][51];
6 __int64 s[51][51];
7 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
8 int n;
9
10 struct pp
11 {
12 int x,y;
13 };
14 queue<pp> que;
15
16 void bfs()
17 {
18
19 pp a,b;
20 int dx,dy,i,spend;
21 a.x=n-1;a.y=n-1;
22 m[n-1][n-1]=map[n-1][n-1];
23 que.push(a);
24 while(!que.empty())
25 {
26 b=que.front();
27 que.pop();
28 for(i=0;i<4;i++)
29 {
30 dx=b.x+dir[i][0];
31 dy=b.y+dir[i][1];
32 if(dx>=0&&dx<n&&dy>=0&&dy<n)
33 {
34 spend=m[b.x][b.y]+map[dx][dy];
35 if(m[dx][dy]==-1||spend<m[dx][dy])
36 {
37 a.x=dx;
38 a.y=dy;
39 m[dx][dy]=spend;
40 que.push(a);
41 }
42 }
43 }
44 }
45 }
46 __int64 dfs(int x,int y)
47 {
48 int i;
49 if(s[x][y]>0)
50 return s[x][y];
51 if(x==n-1&&y==n-1)
52 return 1;
53 for(i=0;i<4;i++)
54 {
55 int xx=x+dir[i][0];
56 int yy=y+dir[i][1];
57 if(xx>=0&&xx<n&&yy>=0&&yy<n)
58 {
59 if(m[x][y]>m[xx][yy])
60 {
61 s[x][y]+=dfs(xx,yy);
62 }
63 }
64 }
65 return s[x][y];
66 }
67 int main()
68 {
69 int i,j;
70 while(cin>>n)
71 {
72 for(i=0;i<n;i++)
73 for(j=0;j<n;j++)
74 {
75 cin>>map[i][j];
76 m[i][j]=-1;
77 }
78 while(!que.empty()) que.pop();
79 memset(s,0,sizeof(s));
80 bfs();
81 dfs(0,0);
82 cout<<s[0][0]<<endl;
83 }
84 return 0;
85 }
多编程,多思考,多付出,才会有成绩!