HDU

来源:互联网 发布:笔记本电脑散热器 知乎 编辑:程序博客网 时间:2024/06/05 23:40

题目大意:n*n 棋盘,老鼠从(0,0)出发,可以上下左右移动吃奶酪,每次最多 k 步,且需要保证下一格奶酪比本格多,问最多能吃到多少。
解题思路:dp + 搜索
dp[][] = max(所有可以从当前点走到的点的dfs的结果集)
记得加上当前格子的值

#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<string.h>#include<string>#include<queue>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))const int INF = 0x3f3f3f3f;const int NINF = -INF -1;const int MAXN = 2000+5;using namespace std;int dx[] = {-1, 0, 1, 0};int dy[] = {0, -1, 0, 1};int n, k;int map[MAXN][MAXN], dp[MAXN][MAXN];int dfs(int x, int y) {    int ans = 0;    if (!dp[x][y]) {        for (int i = 1; i <= k; i++)            for (int j = 0; j < 4; j++) {                int X = x + dx[j]*i;                int Y = y + dy[j]*i;                if (X < 0 || Y < 0 || X >= n || Y >= n) continue;                if (map[X][Y] > map[x][y])                    ans = max(ans, dfs(X, Y));            }        dp[x][y] = ans + map[x][y];    }    return dp[x][y];}int main() {    while (scanf("%d%d", &n, &k) && n+k != -2) {        for (int i = 0; i < n; i++)            for (int j = 0; j < n; j++)                scanf("%d", &map[i][j]);        memset(dp, 0, sizeof(dp));        printf("%d\n", dfs(0, 0));    }    return 0;}
原创粉丝点击