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;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- CookIE与session对象
- 访问网页时:已拦截跨源请求:同源策略禁止读取位于 http:的远程资源。(原因:CORS 头缺少 'Acce:
- 高并发基础之单例模式(六)
- 算法系列——滑动窗口最大值
- MySQL错误整理
- HDU
- docker-镜像
- Android学习笔记三十五之HTTP协议
- C++primer阅读笔记------------用于大型程序的工具
- Go中的for语句
- 目标检测中背景建模方法
- 关于博弈论基础知识的一些总结
- 实现echarts插件刻度轴的二级刻度
- 重载函数的调用不明确、链接器错误问题解决