此题大意讲的是从起点到终点,要求若从A到B,则需保证A到终点的时间比B到终点时间要长。由于有此要求,必然想到动态规划记录其最短路线的状态,但传统动态规划却解决不了。
故采用记忆化搜索,记忆化搜索=搜索形式+动态规划思想
1 #include2 #include 3 #include 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 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 =0&&dy 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 =0&&yy 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 >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< <
多编程,多思考,多付出,才会有成绩!