第5回全国選手権javaテスト質問7:一般G

一般G


将軍Gはよく訓練された軍隊を持っています。将軍Gを除いて、この軍隊のすべての兵士は直属の上司を持っています(他の兵士または将軍Gかもしれません)。さて、G将軍は特別な任務を引き受けます。死の部隊を編成するために何人かの兵士(少なくとも1人)を派遣する必要があります。死の部隊のメンバーの独立性を高めるために、兵士が死の部隊にいる場合、彼の直属の上司は死の部隊にいられないことが必要です。
すみません、G将軍は死の部隊を派遣するためにいくつの方法が必要ですか?将軍Gは兵士として死の部隊に入ることができることに注意してください。
入力フォーマット入力
の最初の行には、一般Gを含む軍隊の数を表す整数nが含まれています。軍の兵士には1からnまでの番号が付けられ、将軍Gには1の番号が付けられています。
次のn-1の数字は、それぞれ2、3、…、nの番号が付けられた兵士の直接の上位番号を表し、iの番号が付けられた兵士の直接の上位の番号はi未満です。
出力フォーマット
デスチームを派遣する計画の数を示す整数を出力します数が多い場合があるため、この数の残りを10007で割った値を出力するだけで済みます。
サンプル入力1
3
1 1
出力例1
4
サンプルについて
4つの方法がある:
1を選択し、
2を選択し、
3を選択し、
2を選択し、3。
サンプル入力2
7
1 1 2 2 3 3
サンプル出力2
40
データ規模と大会
データの20%を、N≤20と、
データの40%を、N≤100;
データの100%を、1≤N≤ 100000。
方法1の
アイデア:
dfsを使用できます。各兵士には、行くかどうかの2つの選択肢があります。検索が終了する条件は、すべての兵士をトラバースして解決策を取得することですが、最終結果は1つ減らす必要があります。すべての兵士が行かないという計画があります。
手順

count=0
def dfs(nu):
    global count
    if n+1==nu:
        count+=1
        return
    if ids[k[nu]]==0:
        ids[nu]=0
        dfs(nu+1)
        ids[nu]=1
        dfs(nu+1)
    else:
        ids[nu] = 0
        dfs(nu + 1)
        ids[nu] = 1

n=int(input())
k=(list(map(int,input().split())))
ids=[i for i in range(0,n+1)]
k.insert(0,0)
k.insert(1,0)
dfs(1)
print((count-1)%10007)

方法2

dpグラフの形式で実行でき、それをツリーと見なすことができます。次に、入力データが隣接リストに格納され、dp [u] [を使用してdfsを使用してツリーのすべての頂点をトラバースします。 1]、dp [u] [1]は、それぞれ行くことと行かないことを意味し、dp [u] [1] = dp [u] [1] dp [j] [の場合、動的プログラミングのアイデアを使用してすべての時間をカウントします0] dp [u] [1]が行くとき、彼の部下のdp [j] [0]は行かない、そして彼が彼に行った回数を掛けると、dp [u] [1]の総数に等しい。逆はdp [u] [0] = dp [u] [0](dp [j] [0] + dp [j] [1])です。これは再帰形式であり、最終結果はdp [1] [0]であるためです。 + dp [1] [1] -1、マイナス1は、すべてに行かない可能性を示します。
手順

n=int(input())
dp=[[0 for i in range(2) ]for i in range(n+1)] 

def dfs(u):
    dp[u][0]=dp[u][1]=1
    i=h[u]
    while i!=0:
        j=e[i]
        dfs(j)
        dp[u][1]=(dp[u][1]*dp[j][0])%10007
        dp[u][0]=(dp[u][0]*(dp[j][0]+dp[j][1]))%10007
        i=nx[i]
h=[0 for i in range(n+1)]
e=[0 for i in range(n+1)]
nx=[0 for i in range(n+1)]
idx=1
x=list(map(int,input().split()))
for i in range(0,n-1):
    e[idx]=i+2
    nx[idx]=h[x[i]]
    h[x[i]]=idx
    idx+=1
dfs(1)
print((dp[1][0]+dp[1][1]-1)%10007)

転載は禁止されています。自習のみ。プログラムエラーについては責任を負いません。

おすすめ

転載: blog.csdn.net/weixin_46640345/article/details/112602391