zoukankan      html  css  js  c++  java
  • Java实现蓝桥杯G将军

    G将军有一支训练有素的军队,这个军队除开G将军外,每名士兵都有一个直接上级(可能是其他士兵,也可能是G将军)。现在G将军将接受一个特别的任务,需要派遣一部分士兵(至少一个)组成一个敢死队,为了增加队员的独立性,要求如果一名士兵在队中,他的直接上级不能在队中。
    请问,G将军有多少种派出队的方法。注意,G将军也可以作为一个士兵进入队。
    输入格式
    输入的第一行包含一个整数n,表示包括G将军在内的军队的人数。军队的士兵从1至n编号,G将军编号为1。
    接下来n-1个数,分别表示编号为2, 3, …, n的士兵的直接上级编号,编号i的士兵的直接上级的编号小于i。
    输出格式
    输出一个整数,表示派出队的方案数。由于数目可能很大,你只需要输出这个数除10007的余数即可。
    样例输入1
    3
    1 1
    样例输出1
    4
    样例说明
    这四种方式分别是:

    1. 选1;
    2. 选2;
    3. 选3;
    4. 选2, 3。
      样例输入2
      7
      1 1 2 2 3 3
      样例输出2
      40

    数据规模与约定
    对于20%的数据,n ≤ 20;
    对于40%的数据,n ≤ 100;
    对于100%的数据,1 ≤ n ≤ 100000。

    资源约定:
    峰值内存消耗(含虚拟机) < 256M
    CPU消耗 < 2000ms

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
    注意:主类的名字必须是:Main,否则按无效代码处理。

    PS:好久没看了,咋一的看回来发现,(⊙o⊙)?这是什么???
    dp【root】【0】就是当前人不去的可能
    dp【root】【1】就是当前人去的可能

    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Main {
        public static int n;
        public static int MOD = 10007;
        public static ArrayList<Integer>[] list;
        public static long[][] dp;
        
        public void dfs(int root) {
            dp[root][0] = 1;
            dp[root][1] = 1;
            for(int i = 0;i < list[root].size();i++) {
                int child = list[root].get(i);
                dfs(child);
                dp[root][0] = dp[root][0] * (dp[child][0] + dp[child][1]) % MOD;
                dp[root][1] = dp[root][1] * dp[child][0] % MOD;
            }
        }
        
        @SuppressWarnings("unchecked")
        public static void main(String[] args) {
            Main test = new Main();
            Scanner in = new Scanner(System.in);
            n = in.nextInt();
            list = new ArrayList[n + 1];
            for(int i = 1;i <= n;i++)
                list[i] = new ArrayList<Integer>();
            for(int i = 2;i <= n;i++) {
                int father = in.nextInt();
                list[father].add(i);
            }
            dp = new long[n + 1][2];
            test.dfs(1);
            long result = (dp[1][0] + dp[1][1] - 1) % MOD;
            System.out.println(result);
        }
    }
    
  • 相关阅读:
    简明Python3教程 12.问题解决
    简明Python3教程 11.数据结构
    【SPOJ 694】Distinct Substrings
    【codeforces Manthan, Codefest 17 C】Helga Hufflepuff's Cup
    【CF Manthan, Codefest 17 B】Marvolo Gaunt's Ring
    【CF Manthan, Codefest 17 A】Tom Riddle's Diary
    【SPOJ 220】 PHRASES
    【POJ 3261】Milk Patterns
    【POJ 3294】Life Forms
    【POJ 1226】Substrings
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13076411.html
Copyright © 2011-2022 走看看