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

hdu1078 记忆化搜索

时间:2017-04-16 18:57:35      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:hdu   main   ++   int   起点   nbsp   memset   continue   break   

题意:

  给你n*n的地图  每一个格子有一个值仅仅能从值小的格子走到值较大的格子   给你k每次上下左右最多走k步   问你走的格子最大值的是多少

dp【i】【j】表示以(i,j)为起点的能得到的最大值    然后深搜求解

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;


int n,k,dp[110][110],cost[110][110];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int mark[110][110];
int max(int a,int b)
{
    return a>b?

a:b; } int dfs(int x,int y) { int i,j,sum=0; for(i=1;i<=k;i++) { for(j=0;j<4;j++) { int xx=x+dir[j][0]*i; int yy=y+dir[j][1]*i; if(xx<0||xx>=n||yy<0||yy>=n) continue; if(cost[xx][yy]<=cost[x][y]) continue; if(mark[xx][yy]) { sum=max(sum,dp[xx][yy]); } else { mark[xx][yy]=1; sum=max(sum,dfs(xx,yy)); } } } dp[x][y]=cost[x][y]+sum; return dp[x][y]; } int main() { int i,j; while(~scanf("%d%d",&n,&k)) { if(n<0) break; for(i=0;i<n;i++) for(j=0;j<n;j++) { scanf("%d",&cost[i][j]); } memset(dp,0,sizeof(dp)); memset(mark,0,sizeof(mark)); mark[0][0]=1; printf("%d\n",dfs(0,0)); } return 0; }



hdu1078 记忆化搜索

标签:hdu   main   ++   int   起点   nbsp   memset   continue   break   

原文地址:http://www.cnblogs.com/liguangsunls/p/6719509.html

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