开始这个题目理解错了,求的是该节点为素数且孩子也是素数(改节点最大,此节点未延伸到最后)的个数。
注释是我开始写的代码,也运用到动态规划,也是一种写法吧。
package com.bluecup.org;
import java.util.Scanner;
import java.util.TreeSet;
import javax.swing.text.html.HTMLDocument.Iterator;
public class PrimeNumber {
/**
* @param args
*/
static int r[]=new int[20];
static int value[]=new int[20];
static boolean sign[]=new boolean[20];
static boolean used[]=new boolean[20];
static int m[]=new int[20];
static TreeSet<Integer>[] sets=new TreeSet[20];
static int n;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
n=scan.nextInt();
for(int i=1;i<=n;i++)
{
int v=scan.nextInt();
value[i]=v;
sign[i]=isPrice(v);
}
for(int i=1;i<=n;i++)
{
sets[i]=new TreeSet<Integer>();
}
int k=0;
do
{
k=scan.nextInt();
int kk=scan.nextInt();
if(k!=0)
sets[k].add(kk);
}while(k!=0);
dp(1);
System.out.println(sum);
//计算改节点有几个比本节点小的素数节点
/*java.util.Iterator<Integer> it;
for(int i=n;i>=1;i--)
{
it=sets[i].iterator();
if(sign[i])
{
for(int j=1;j<=sets[i].size();j++)
{
int b=it.next();
if(sign[b])
{
if(value[i]>value[b])
{
m[i]=m[i]+m[b]+1;
}
r[i]=r[i]+r[b]+1;
}
}
}
}
for(int i=1;i<=n;i++)
System.out.println(m[i]);*/
}
static int sum;
private static void dp(int i) {
// TODO Auto-generated method stub
used[i]=true;
boolean b=sign[i];
m[i]=value[i];
java.util.Iterator<Integer> it=sets[i].iterator();
for(int j=1;j<=sets[i].size();j++)
{
int v=it.next();
if(!used[v])
{
dp(v);
if(!sign[n])
{
b=false;
}
else
{
if(m[v]>value[i])
b=false;
if(m[v]>m[i])
m[i]=m[v];
}
}
}
if(b)
sum++;
}
static boolean isPrice(int v)
{
for(int i=2;i<=v/2;i++)
{
if(v%i==0)
return false;
}
return true;
}
}