问题六: Crabbles
Input:crabbles.in output:crabbles.out
Jennifer正在练习Crabbles,准备参加比赛。她从包里掏出一把Crabble陶片,想要以最高分组成单词。每片陶片有一个字母(用于组成单词)和一个数字(其分值)。每片陶片她最多可以用一次,不要求她用每片陶片。她组成的单词必须出现在她的词典中。她的分值是单词中所用陶片的分值之和。
注意,在Crabbles中,有相同字母的不同的陶片可能会有不同的分值。
为检查她的工作,Jennifer想要一个程序,告诉她对给定一组陶片的可能的最大分值。你的任务是写出这个程序。
Input Specification
第一行是整数N,1<=N<=100,000,表示词典中的单词数。随后的N行,每行是一个单词。每个词典单词仅由小写字母组成。接下来的一行是一个整数M,1<=M<=1000,表示Crabbles把数,Jennifer打算玩这么多把。随后的M行每行是一把,包含一个整数P,1<=P<=10,表示这一把中包含的陶片数。下面的P行,每行是一片陶片,由一个小写字母(陶片上的字母)和整数V(陶片的分值)组成。
Output Specification
对输入中的每一把,输出这把可能会得到的最大分值。
Sample Input
2
abcd
hgfe
1
10
a 1
b 2
c 3
d 4
e 5
f 6
g 7
h 8
import
java.io.
*
;
import java.util. * ;
class ka
... {
int value;
char ch;
public ka(int value,char ch)
...{
this.value=value;
this.ch=ch;
}
}
class Test6
... {
public static void main(String[] args) throws Exception
...{
BufferedReader bf=new BufferedReader(new FileReader("crabbles.in"));
Set v=new HashSet();
String str;
int n=Integer.parseInt(bf.readLine());
for(int i=0;i<n;i++)
...{
str=bf.readLine();
char a[]=new char[str.length()];
str.getChars(0,str.length(),a,0);
Arrays.sort(a);
v.add(new String(a));
}
int m=Integer.parseInt(bf.readLine());
long t1=System.currentTimeMillis();
for(int i=0;i<m;i++)
...{
int char_sum=Integer.parseInt(bf.readLine());
ka ch[]=new ka[char_sum];
int max=0;
String tmp[];
for(int j=0;j<char_sum;j++)
...{
tmp=bf.readLine().split(" ");
ch[j]=new ka(Integer.parseInt(tmp[1]),tmp[0].charAt(0));
}
Arrays.sort(ch,new Comparator()...{
public int compare (Object a,Object b)
...{
ka ka1=(ka)a;
ka ka2=(ka)b;
return ka1.ch-ka2.ch;
}});
for(int j=1;j<(1<<char_sum);j++)
...{
int temp=0;
String s="";
for(int k=0;k<char_sum;k++)
...{
if((j&(1<<k))>0)
...{
temp+=ch[k].value;
s=s+ch[k].ch;
}
if(temp>max&&v.contains(s))max=temp;
}
}
System.out.println(max);
}System.out.println("time:"+(System.currentTimeMillis()-t1));
}
}
import java.util. * ;
class ka
... {
int value;
char ch;
public ka(int value,char ch)
...{
this.value=value;
this.ch=ch;
}
}
class Test6
... {
public static void main(String[] args) throws Exception
...{
BufferedReader bf=new BufferedReader(new FileReader("crabbles.in"));
Set v=new HashSet();
String str;
int n=Integer.parseInt(bf.readLine());
for(int i=0;i<n;i++)
...{
str=bf.readLine();
char a[]=new char[str.length()];
str.getChars(0,str.length(),a,0);
Arrays.sort(a);
v.add(new String(a));
}
int m=Integer.parseInt(bf.readLine());
long t1=System.currentTimeMillis();
for(int i=0;i<m;i++)
...{
int char_sum=Integer.parseInt(bf.readLine());
ka ch[]=new ka[char_sum];
int max=0;
String tmp[];
for(int j=0;j<char_sum;j++)
...{
tmp=bf.readLine().split(" ");
ch[j]=new ka(Integer.parseInt(tmp[1]),tmp[0].charAt(0));
}
Arrays.sort(ch,new Comparator()...{
public int compare (Object a,Object b)
...{
ka ka1=(ka)a;
ka ka2=(ka)b;
return ka1.ch-ka2.ch;
}});
for(int j=1;j<(1<<char_sum);j++)
...{
int temp=0;
String s="";
for(int k=0;k<char_sum;k++)
...{
if((j&(1<<k))>0)
...{
temp+=ch[k].value;
s=s+ch[k].ch;
}
if(temp>max&&v.contains(s))max=temp;
}
}
System.out.println(max);
}System.out.println("time:"+(System.currentTimeMillis()-t1));
}
}