zoukankan      html  css  js  c++  java
  • HDU1087

     1 /*记忆化dfs+dp,因为每次最多走k步,所以上下左右的方向有所扩展,
     2 dp[i][j]存的是从dp[i][j]出发能吃的最大个数*/
     3 #include<stdio.h>
     4 #include<string.h>
     5 #include<algorithm>
     6 using namespace std;
     7 const int maxn=110;
     8 int map[maxn][maxn],vis[maxn][maxn];
     9 int dp[maxn][maxn];//dp[i][j]表示从i,j出的最大蛋糕数目
    10 int n,m,k;
    11 void init()
    12 {
    13     memset(dp,0,sizeof(dp));
    14     memset(vis,0,sizeof(vis));
    15 }
    16 int dfs(int x,int y)
    17 {
    18     if(dp[x][y]) return dp[x][y];
    19     int i,j;
    20     dp[x][y]=map[x][y];
    21     for(i=1;i<=k;i++)
    22     {
    23           if(x-i>=1 && map[x-i][y]>map[x][y])
    24           {
    25               dp[x][y]=max(dp[x][y],dfs(x-i,y)+map[x][y]);
    26           }
    27           if(x+i<=n && map[x+i][y]>map[x][y])
    28           {
    29               dp[x][y]=max(dp[x][y],dfs(x+i,y)+map[x][y]);
    30           }
    31           if(y-i>=1 && map[x][y-i]>map[x][y])
    32           {
    33               dp[x][y]=max(dp[x][y],dfs(x,y-i)+map[x][y]);
    34           }
    35           if(y+i<=n && map[x][y+i]>map[x][y])
    36           {
    37               dp[x][y]=max(dp[x][y],dfs(x,y+i)+map[x][y]);
    38           }
    39     }
    40     return dp[x][y];
    41 }
    42 int main()
    43 {
    44     int i,j;
    45     while(scanf("%d%d",&n,&k)!=EOF)
    46     {
    47         if(n==-1 && k==-1) break;
    48         for(i=1;i<=n;i++)
    49         for(j=1;j<=n;j++)
    50         scanf("%d",&map[i][j]);
    51         init();
    52         printf("%d
    ",dfs(1,1));
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    团队冲刺第一阶段第三天
    团队冲刺第一阶段第二天
    团队冲刺第一阶段第一天
    学习进度07
    学习进度06
    结对编程之子数组最大的和(由于一直登不上我的账号,在规定日期内只在我搭档的博客上交了)
    小学四则运算网页版
    团队介绍
    学习进度条05
    111
  • 原文地址:https://www.cnblogs.com/okboy/p/3269216.html
Copyright © 2011-2022 走看看