51Nod-1293-球与切换器
来源:互联网 发布:珠江啤酒 阿里云 编辑:程序博客网 时间:2024/05/22 03:52
ACM模版
描述
题解
看到这个问题,直接就有了思路,但是我的解法Memory limit exceeded
了……
由于我是用的 bfs 解的,所以大概是因为入队列的结点太多了,并且缺乏好的优化,但是我实在是想不到什么更好的优化了,于是找了一下大牛的题解,发现可以通过创建一个 long long res[MAXN][MAXN][2]
的三维数组来保存状态,用 res[x][y][0] 表示坐标为 (x, y) 的位置将要向下移动的个数,用 res[x][y][1] 表示坐标为 (x, y) 的位置将要向右移动的个数,最后输出 res[N][M][0] 即可。
这个问题是一个十分不错的模拟问题,不过卡时间和内存比较明显(当然,也可以说我自己太笨了)。
代码
#include <iostream>#include <algorithm>using namespace std;const int MAXN = 1005;int M, N;long long k;int state[MAXN][MAXN];long long res[MAXN][MAXN][2];int main(){ scanf("%d%d%lld", &M, &N, &k); long long temp; for (int i = 1; i <= N; i++) { for (int j = 1; j <= M; j++) { scanf("%d", &state[i][j]); if (i != 1 || j != 1) { temp = res[i - 1][j][0] + res[i][j - 1][1]; switch (state[i][j]) { case 0: res[i][j][0] = res[i - 1][j][0]; res[i][j][1] = res[i][j - 1][1]; break; case 1: res[i][j][1] = (temp + 1) / 2; res[i][j][0] = temp / 2; break; default: res[i][j][0] = (temp + 1) / 2; res[i][j][1] = temp / 2; break; } } else { switch (state[i][j]) { case 0: res[i][j][0] = k; res[i][j][1] = 0; break; case 1: res[1][1][1] = (k + 1) / 2; res[1][1][0] = k / 2; break; default: res[1][1][0] = (k + 1) / 2; res[1][1][1] = k / 2; break; } } } } printf("%lld\n", res[N][M][0]); return 0; }
1 0
- 51nod 1293:球与切换器
- 51Nod-1293-球与切换器
- 51nod 1293 球与切换器
- 51Nod-球与切换器-1293
- 【51nod 球与切换器】+ dp
- [DP] 51Nod 1293 球与切换器
- 1293 球与切换器
- 1293 球与切换器(dp)
- 【51Nod1293】球与切换器
- 51nod 1407 与与与与
- 51Nod-1406-与查询
- 51nod 圆与三角形
- 51nod-1406 与查询
- 51nod 1406 与查询
- 51nod 1406 与查询
- 51nod 1298 圆与三角形
- 51Nod 1298 圆与三角形
- [51nod]1298 圆与三角形
- 欢迎使用CSDN-markdown编辑器
- 数据库设计规范
- 简易迷宫--递归算法实现
- C++ 内部链接与外部链接
- 从svn检出来的项目到本地,如何取消和svn的关联
- 51Nod-1293-球与切换器
- Deep Learning
- Linux常用系统函数
- java谁是最强的女汉子
- MySQL索引
- 史上最简单的SpringCloud教程 | 第十三篇: 断路器聚合监控(Hystrix Turbine)
- 间隔几天执行问题
- strcpy函数的实现
- javascript考勤日历