HDOJ 2050递推

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2050
在题目中,参考了别人的博客才得出其解题思路:参考博客:https://blog.csdn.net/wu_lai_314/article/details/8219236
首先我们从一条线的开始判断,要使得取的面最多,则n条线要与n-1条线之间都要有交点,则当第n条线与n-1条线相交的时候,则会出现n-2条线段和2条射线,此n-2条线段会将已有的面分成两个面,每条射线也会将已有的面分成两个面,则我们得出一下式子为f(n)=f(n-1)+n-2+2;起分别为当加入第n条线的时候,则会在第n-1条基础上再多家n-2(线段切割的面)+2(两条射线切割的面)

当我们折线的时候,则在第n条折线的时候,我们首先利用第n条折线中的其中一条折边穿过第n-1条折线这些线,为了取得最多面,由于第n-1条折线会产生2(n-1)条线,则要使其折边穿过这2(n-1)条线,则当这条折边穿过这些线的时候会产生,2(n-1)-1条线段,以及两条射线,同理得另外一条折线也可以产生2(n-1)-1条线段,以及两条射线。则他们之间在第n-1条折线的基础上会多增加2(n-1)-1+2(其中一条折线产生的两条射线的多出的两面)+2(n-1)-1+2(另外一条折线产生的两条射线的多出的两面),但是由于这两条折线之间会有交点,则其这第n-1条折线总共会产生两条折线而已,又由于另外两条射线相交产生一个面,则要把这个面加上去,把另外射线产生的面给减掉,则得出公式为多:增加**2(n-1)-1+2(其中一条折线产生的两条射线的多出的两面)+2(n-1)-1+2(另外一条折线产生的两条射线的多出的两面)+1(两条射线产生的面)-2(去掉两条射线产生的面,因为他们之间相交了),则化简得公式f(n)=f(n-1)+4*n-3;
代码:


public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BigInteger[] b = new BigInteger[10001];
        b[1]=BigInteger.valueOf(2);
        b[2]=BigInteger.valueOf(7);
        for(int i=3;i<=10000;i++) {
            int temp =4*i-3;
            b[i]=b[i-1].add(BigInteger.valueOf(temp));
        }
        Scanner sc= new Scanner(System.in);
        int n = sc.nextInt();
        while(n-->0) {
            int a = sc.nextInt();
            System.out.println(b[a]);
            
        }
    }

}

猜你喜欢

转载自blog.csdn.net/So_Band/article/details/88628080