「 HDU 1978 」 How many ways
2024-08-26 20:32:15
# 解题思路
记忆化搜索
一个点可以跳到的点,取决于它现在的能量。而且有一个显而易见的性质就是一条可行路径的终点和起点的横坐标之差加上纵坐标之差肯定小于等于起点的能量。
因为跳到一个点之后,能量和之前的点就已经没有关系了,只与现在的点有关,所以不需要传递能量到下一层。
嗯,思路就是酱紫的
# 附上代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int HA = 1e4;
inline int read() {
int x = , f = ; char c = getchar();
while (c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while (c <= '' && c >= '') {x = x* + c-''; c = getchar();}
return x * f;
}
int T, n, m, en[][], f[][];
bool vis[][];
inline int dfs(int x, int y) {
if(x > n || y > m || x < || y < ) return ;
if(x == n && y == m) return ;
if(vis[x][y] != false) return f[x][y];
for(int i=; i<=en[x][y]; i++) {
for(int j=; j+i<=en[x][y]; j++) {
int xx = i + x, yy = j + y;
if(xx == x && yy == y) continue;
f[x][y] += dfs(xx, yy);
if(f[x][y] >= HA) f[x][y] %= HA;
}
}
vis[x][y] = true;
return f[x][y];
}
int main() {
T = read();
while (T--) {
memset(vis, , sizeof(vis));
memset(f, , sizeof(f));
n = read(), m = read();
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
en[i][j] = read();
printf("%d\n", dfs(, ) % HA);
}
}
最新文章
- 添加Silverlight应用到HTML
- Oracle 数据库基础学习 (八) PL/SQL综合练习
- centos网卡配置和防火墙停止和启动
- linux 相关快捷键
- Java 读取excel 文件 Unable to recognize OLE stream 错误
- POJ3469 &; 最小割(最大流)模板
- 浅析Hadoop文件格式
- 在线聊天室的实现(1)--websocket协议和javascript版的api
- OpenGL三维镂垫
- C#操作redis代码汇总
- Web页面在手机上显示过大问题
- 如何在oracle中导入导出(备份&;恢复)dmp数据库文件
- 网络编程(UDP协议-聊天程序)
- win10 uwp 修改Pivot Header 颜色
- python_斐波那契数列
- 小技巧-C#文本快速删除空行
- LTE学习笔记(一)——背景知识
- Luogu P1337 [JSOI2004]平衡点 / 吊打XXX
- C++常函数
- wget无法建立SSL连接
热门文章
- SqlSugar解决SQLite访问的问题:Unable to load DLL &#39;SQLite.Interop.dll&#39;
- Linux 常用命令七 grep
- bzoj 1610: [Usaco2008 Feb]Line连线游戏【瞎搞】
- [Swift]扩展String类:实现find()查找子字符串在父字符串中的位置
- 爬虫—Requests高级用法
- Jquery插件jqprint-0.3.js实现打印
- ABP教程(三)- 开始一个简单的任务管理系统 – 后端编码
- 如何通过SecureCRT作为客户端连接Linux服务器
- 怎么学好XXX
- 重构29-Remove Middle Man(去掉中间人)