[HDU 2926]I Speak Whales[递归][划分]

来源:互联网 发布:线性优化模型 编辑:程序博客网 时间:2024/06/05 22:52

题目链接:[HDU 2926]I Speak Whales[递归][划分]
题意分析:
W20=[1]
W21=...
W22=...
后面的是由四个前面的构成,而右下角是前面的相反矩阵。
现在求:第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
原创粉丝点击