2563:统计问题

来源:互联网 发布:mac免费的视频播放器 编辑:程序博客网 时间:2024/06/01 09:01

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2563

方法一:dfs打表

思路:方法一比较流氓,完全是利用了数据小这一点,不过也算是锻炼一下dfs吧,一看题,整个题目叙述简直就是迷宫题的翻版啊有木有,不假思索直接dfs了,然后跪了。首先,dfs速度太慢,必然超时;此外这里的迷宫的起点选择要注意,选择在迷宫矩阵的正中央,由于n不会超过20,矩阵开到40*40就可以保证左右均可以走,否则会造成数组越界;还有,如果按照我的写法,需要把起点也要标记上,否则会走回原点。

难点:dfs的改写

注意:主函数内注释掉的部分是dfs主体部分,由于只要dfs存在就会超时,因此可耻地直接打表了。

#include<cstdio>#include<iostream>#include<cmath>using namespace std;const int MAX = 100;int num,n;int dir[3][2] = {{1,0},{-1,0},{0,1}};int book[MAX][MAX] = {0};void dfs(int x,int y,int step){    int dx,dy;     if(step == n)    {        //cout<<x<<" "<<y<<endl;        num++;        return;    }    book[50][0] = 1;    for(int i = 0;i < 3;i++)    {        dx = x+dir[i][0];        dy = y+dir[i][1];        if(book[dx][dy] == 1)            continue;        book[dx][dy] = 1;        dfs(dx,dy,step+1);        book[dx][dy] = 0;    }}int main(){    int t;    int ans[25] = {0,3,7,17,41,99,239,577,1393,3363,8119,19601,47321,114243,275807,665857,1607521,3880899,9369319,22619537,54608393};    /*for(n= 1;n <= 20;n++)    {        book[MAX][MAX] = {0};        num = 0;        dfs(50,0,0);        ans[n] = num;            cout<<ans[n]<<" ";    }*/    while(cin>>t)    {        while(t--)        {            cin>>n;            cout<<ans[n]<<endl;        }    }}

方法二:递推

思路:这个方法是比较主流的方法,代码实现也比较简单,时间上也是可以允许的,但是思路还是没有搞懂,附思路链接:

http://www.cnblogs.com/cchun/archive/2012/02/15/2520236.html

难点:递推关系式的构建,代码实现分分钟

#include<cstdio>#include<iostream>#include<cmath>using namespace std;int getNum(int x){    if(x == 1)        return 3;    else if(x == 0)        return 1;    else        return 2*getNum(x-1)+getNum(x-2);}int main(){    int t,n;    while(cin>>t)    {        while(t--)        {            cin>>n;            cout<<getNum(n)<<endl;        }    }}



0 0
原创粉丝点击