hdu5686 Problem B

题目链接: hdu5686 ( Problem B )

\(dp[n][1]\) 代表长度为 \(n\) 的全 \(1\) 序列构成的新序列中以 \(1\) 为尾的序列数量;

\(dp[n][0]\) 代表长度为 \(n\) 的全 \(1\) 序列构成的新序列中以 \(2\) 为尾的序列数量。

递推关系如下:

\[\begin{cases} dp[i][0]=dp[i-1][1],&i>0 \\ dp[i][1] = dp[i-1][0]+dp[i-1][1], & i>0 \\ dp[0][0]=1, dp[0][1]=0 \end{cases} \]

由于 \(dp[n]\) 的状态只与 \(dp[n-1]\) 的状态有关,故可只用一维数组迭代 \(n\) 次。

结果可能很大,超过 \(2^{200}\) ,可用 \(java\) 的 \(BigInteger\) 。

\(java\ AC\) 代码:

/**
 * hdu5686 Problem B
 *
 */

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = in.nextInt();
            // dp[1]代表以1为尾的序列数量,dp[0]代表以2为尾的序列数量
            BigInteger[] dp = {BigInteger.ONE, BigInteger.ZERO};
            while (n-- != 0) {
                BigInteger t0 = dp[1];
                BigInteger t1 = dp[0].add(dp[1]);
                dp[0] = t0;
                dp[1] = t1;
            }
            System.out.println(dp[0].add(dp[1]));
        }
    }
}

事实上,答案为斐波那契数列的第 \(N+1\) 项。

上一篇:unix网络编程str_cli使用epoll实现


下一篇:Codeforces Round #761 B. GCD Problem