HDU 1078 记忆化dfs

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

int n,k;
int graph[105][105];
int dp[105][105];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
bool vis[105][105];
int ans = 0;

//void dfs(int x,int y,int level,int sum){
//    if(sum > ans)
//        ans = sum;
//    for(int i=0;i<4;i++){
//        int xx = x+dx[i];
//        int yy = y+dy[i];
//        if(xx>=0 && yy>=0 && xx<n && yy<n && graph[xx][yy] > graph[x][y]){
//            if(!vis[xx][yy]){
//                vis[xx][yy] = true;
//                dfs(xx,yy,level+1,sum+graph[xx][yy]);
//                vis[xx][yy] = false;
//            }
//        }
//    }
//    return ;
//}

int dfs(int x,int y){
    if(dp[x][y])
        return dp[x][y];
    int cnt = 0;
    for(int i=0;i<4;i++){
        for(int j=1;j<=k;j++){  //向相同的方向走k步
            int xx = x+dx[i]*j;
            int yy = y+dy[i]*j;
            if(xx<0 || xx>=n || yy<0 || yy>=n)
                break;
            if(graph[xx][yy] > graph[x][y]){  //下一步的数量是否比当前位置的多
                cnt = max(cnt,dfs(xx,yy));
            }
        }
    }
    return dp[x][y] = graph[x][y] + cnt;
}

int main(){
    while(1){
        scanf("%d%d",&n,&k);
        memset(vis,false,sizeof(vis));
        memset(dp,0,sizeof(dp));
        ans = 0;
        if(n==-1 && k==-1)
            break;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                scanf("%d",&graph[i][j]);
            }
        }
        //vis[0][0] = true;
        //dfs(0,0,0,graph[0][0]);
        printf("%d\n",dfs(0,0));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42246923/article/details/80759936