HDU1078 记忆化DFS+dp

来源:互联网 发布:76.164.232.68indx.php 编辑:程序博客网 时间:2024/06/02 18:57
/*记忆化dfs+dp,因为每次最多走k步,所以上下左右的方向有所扩展,dp[i][j]存的是从dp[i][j]出发能吃的最大个数*/#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn=110;int map[maxn][maxn],vis[maxn][maxn];int dp[maxn][maxn];//dp[i][j]表示从i,j出的最大蛋糕数目int n,m,k;void init(){    memset(dp,0,sizeof(dp));    memset(vis,0,sizeof(vis));}int dfs(int x,int y){    if(dp[x][y]) return dp[x][y];    int i,j;    dp[x][y]=map[x][y];    for(i=1;i<=k;i++)    {          if(x-i>=1 && map[x-i][y]>map[x][y])          {              dp[x][y]=max(dp[x][y],dfs(x-i,y)+map[x][y]);          }          if(x+i<=n && map[x+i][y]>map[x][y])          {              dp[x][y]=max(dp[x][y],dfs(x+i,y)+map[x][y]);          }          if(y-i>=1 && map[x][y-i]>map[x][y])          {              dp[x][y]=max(dp[x][y],dfs(x,y-i)+map[x][y]);          }          if(y+i<=n && map[x][y+i]>map[x][y])          {              dp[x][y]=max(dp[x][y],dfs(x,y+i)+map[x][y]);          }    }    return dp[x][y];}int main(){    int i,j;    while(scanf("%d%d",&n,&k)!=EOF)    {        if(n==-1 && k==-1) break;        for(i=1;i<=n;i++)        for(j=1;j<=n;j++)        scanf("%d",&map[i][j]);        init();        printf("%d\n",dfs(1,1));    }    return 0;}

原创粉丝点击