[HDU 2926]I Speak Whales[递归][划分]
来源:互联网 发布:线性优化模型 编辑:程序博客网 时间:2024/06/05 22:52
题目链接:[HDU 2926]I Speak Whales[递归][划分]
题意分析:
后面的是由四个前面的构成,而右下角是前面的相反矩阵。
现在求:第n个矩阵的第r行从s到t的总和是多少?
解题思路:
我们可以递归着求解,边界条件就是n = 0时,返回1。
由于右上方、左下方和左上方相同,右下方是左上方的相反,所以不管查询的是哪里,我们都能把它递归到左上方的矩阵中。这样一直下去就行了。
个人感受:
递归还是理解不透彻啊~
具体代码如下:
#include<algorithm>#include<cctype>#include<cmath>#include<cstdio>#include<cstring>#include<iomanip>#include<iostream>#include<map>#include<queue>#include<set>#include<sstream>#include<stack>#define ll long long#define pr(x) cout << #x << " = " << (x) << '\n';using namespace std;const int INF = 0x7f7f7f7f;const int MAXN = 111;ll base[MAXN];ll dfs(ll n, ll r, ll s, ll e) { if (n == 0) return 1; ll ret = 0; ll num = base[n] / 2; if (r < num) { if (e < num) ret = dfs(n - 1, r, s, e); else if (s >= num) ret = dfs(n - 1, r, s - num, e - num); else ret = dfs(n - 1, r, s, num - 1) + dfs(n - 1, r, 0, e - num); } else { if (e < num) ret = dfs(n - 1, r - num, s, e); else if (s >= num) ret = -dfs(n - 1, r - num, s - num, e - num); else ret = dfs(n - 1, r - num, s, num - 1) - dfs(n - 1, r - num, 0, e - num); } return ret;}int main(){ #ifdef LOCAL freopen("C:\\Users\\apple\\Desktop\\in.txt", "r", stdin); #endif ll n, r, s, e; base[0] = 1; for (int i = 1; i <= 60; ++i) base[i] = base[i - 1] * 2; while (cin >> n >> r >> s >> e) { if (n == -1 && r == -1 && s == -1 && e == -1) break; cout << dfs(n, r, s, e) << '\n'; } return 0;}
0 0
- [HDU 2926]I Speak Whales[递归][划分]
- I must speak English.
- speak
- Speak
- 整数划分问题--递归求解 例题:HDU 1028
- 整数划分(递归)
- 整数划分《递归法》
- 递归之划分数
- 递归实现整数划分
- 递归之整数划分
- 递归—集合划分
- 递归算法---整数划分
- 整数划分(递归)
- 递归--整数划分问题
- 递归-整数划分问题
- 递归-整数划分问题
- 递归算法-->整数划分
- 递归之整数划分
- 正则表达式学习参考
- 解决matplotlib中文乱码问题
- HDFS追本溯源:租约,读写过程的容错处理及NN的主要数据结构
- iOS面试题五
- windows资源管理(内核对象/GDI对象/user对象)
- [HDU 2926]I Speak Whales[递归][划分]
- 第八章 通知的使用
- c++第1次实验-2
- Java之——将 jsonObject 转换成 对象
- iOS面试题六
- Android事件处理之基于监听的事件处理
- 重整晋商雄风,再现汇通天下 -------《晋商》阅读笔记第5-6章
- 追根溯源---length、length()和size()
- MTK问题总结-----工作中遇到的