Pku acm 2081 Recaman's Sequence

来源:互联网 发布:卖淘宝小号的 编辑:程序博客网 时间:2024/05/16 12:19

http://acm.pku.edu.cn/JudgeOnline/problem?id=2081

一道很简单的动态规划,根据一个递推公式求一个序列,我选择顺序的求解,即自底向上的递推,一个int数组result根据前面的值依此求出序列的每一个结果,另外一个boolean数组flag[i]记录i是否已经出现在序列中,求result的时候用得着,这样就避免了查找。核心的java代码为:

for(i=1;i<=500000;i++)

{

    if(result[i-1]-i>0&&flag[result[i-1]-i]==false)

    {

        result[i] = result[i-1]-i;

        flag[result[i-1]-i] = true;

    }

    else

    {

        result[i] = result[i-1]+i;

        flag[result[i-1]+i] = true;

    }

}

带有详细注释的代码可以在http://download.csdn.net/user/china8848/获得

 

Pku acm 1953 World Cup Noise  动态规划题目总结()

http://acm.pku.edu.cn/JudgeOnline/problem?id=1953

给定一个小于45的整数n,求n2进制数中不含相邻1的数的个数。看似简单的一道题,如果当n=45时,对245次方检查,是无法完成的任务。先分析一下这个问题:

N

1结尾的个数

0结尾的个数

总和

1

1

1

2

2

1

2

3

3

对于n=1来说,以1结尾、以0结尾个数都是1,总和是2,下面过度到2:对于所有以1结尾的数,后面都可以加上0,变为n=2时以0结尾的,而只有结尾为0的数才能加上1(因为不能有两个连续0),这样就可以在n=2的格里分别填上12,总和算出来为3,以此类推,我们可以算出所有n<=45的值,然后根据输入进行相应输出。核心代码如下:

int i,num,count,array[50][2],j=0;

array[1][1] = 1;

array[1][0] = 1;

for(i=2;i<50;i++)

{

        array[i][0] = array[i-1][1];

        array[i][1] = array[i-1][1]+array[i-1][0];

}

我们可以继续找出规律,其实这个就是Fibonacci数列:

F[N] = F[N-1]+F[N-2];可以继续简化代码。

带有详细注释的代码可以在http://download.csdn.net/user/china8848/获得

 

原创粉丝点击