码迷,mamicode.com
首页 > 其他好文 > 详细

记忆化搜索专题

时间:2016-01-08 20:21:15      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

Hdoj  1078 题目足迹

题意:

n*n的矩阵,从(0,0)出发,每个点上有一个数值,每次只能水平或竖直的走至多k个格子,要求总的路线上的数值是严格单增的,并且使总的和最大。

 

代码:

 1     #include<cstdio>
 2     #include<iostream>
 3     #include<algorithm>
 4     #include<cstring>
 5     #define mem(a,b) memset(a,b,sizeof(a))
 6     #define forp(i,n) for(int i=0;i<n;i++)
 7 
 8     const int MAXN = 105;
 9     int n, k;
10     int _m[MAXN][MAXN];
11     int dp[MAXN][MAXN];
12     int di[4][2] = {1,0,-1,0,0,1,0,-1};
13     //方向
14     int dfs( int x, int y){
15         int maxx = 0;
16         //记录当前层最大值
17         int xx, yy, ans;
18         if(!dp[x][y]){
19             forp(i,k){
20                 forp(j,4){
21                     xx = x + di[j][0]*(i+1);
22                     yy = y + di[j][1]*(i+1);
23                     if( xx >= 0 && xx < n && yy > 0 && yy < n && _m[xx][yy] > _m[x][y]){
24                         ans = dfs(xx,yy);//dp[xx][yy]的值
25                         if( ans > maxx)
26                             maxx = ans;
27                     }
28                 }
29             }
30             dp[x][y] = maxx + _m[x][y];
31         }
32         printf("%d %d %d\n",x,y,dp[x][y]);
33         return dp[x][y];
34     }
35 
36     int main (){
37         mem(_m,0);
38         while(~scanf("%d%d",&n,&k)){
39             if( n == -1 && k == -1)
40                 break;
41             forp(i,n)
42                 forp(j,n)
43                     scanf("%d",&_m[i][j]);
44             //数据读入
45             mem(dp,0);
46             int sum = dfs(0,0);
47             //从0点开始进行搜索
48             printf("%d\n",sum);
49         }
50     }

 

记忆化搜索专题

标签:

原文地址:http://www.cnblogs.com/blueprintf/p/5114214.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!