标签:fatmouse and cheese hdu 1078 记忆化搜索
3 1 1 2 5 10 11 6 12 12 7 -1 -1
37
题意:给出n*n的数字矩阵,从(0,0)出发,走的下一步格子上的数要大于当前格子上的数,并且每次可以沿直线前进最多k个位置,也就是每次有4*k个选择,问最后所有数之和的最大值。
思路:记忆化搜索。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 105
#define MAXN 2005
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define FRE(i,a,b)  for(i = a; i <= b; i++)
#define FRL(i,a,b)  for(i = a; i < b; i++)
#define mem(t, v)   memset ((t) , v, sizeof(t))
#define sf(n)       scanf("%d", &n)
#define sff(a,b)    scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define pf          printf
#define DBG         pf("Hi\n")
typedef long long ll;
using namespace std;
int dir[4][2]={0,1,1,0,0,-1,-1,0};
int mp[maxn][maxn];
int sum[maxn][maxn];
int n,k;
bool Isok(int x,int y)
{
    if (x>=0&&x<n&&y>=0&&y<n) return true;
    return false;
}
int dfs(int x,int y)
{
    if (sum[x][y]) return sum[x][y];        //直接返回
    int maxx=0;
    int i,j;
    FRE(i,1,k)
    {
        FRL(j,0,4)
        {
            int dx=x+dir[j][0]*i;
            int dy=y+dir[j][1]*i;
            if (Isok(dx,dy)&&mp[x][y]<mp[dx][dy])
            {
                maxx=max(maxx,dfs(dx,dy));
            }
        }
    }
    sum[x][y]=maxx+mp[x][y];    //把从(x,y)处出发的最优答案记录下来,下次再遇到(x,y)时直接返回这个值
    return sum[x][y];
}
int main()
{
    int i,j;
    while (sff(n,k))
    {
        if (n==-1&&k==-1) break;
        FRL(i,0,n)
        FRL(j,0,n)
        sf(mp[i][j]);
        mem(sum,0);
        pf("%d\n",dfs(0,0));
    }
    return 0;
}
FatMouse and Cheese (hdu 1078 记忆化搜索)
标签:fatmouse and cheese hdu 1078 记忆化搜索
原文地址:http://blog.csdn.net/u014422052/article/details/44455331