您的位置:首页 > 其它

usaco 4.3.4 Letter Game

2014-05-21 10:43 309 查看
/*
ID: daniel.20
LANG: JAVA
TASK: lgame
*/
import java.util.*;
import java.io.*;
import java.math.BigInteger;

class word implements Comparable<word>{
String s;
int value;
public word(String x, int a){
s=x;value=a;
}

@Override
public int compareTo(word t) {
return this.s.compareTo(t.s);
}
}

class problem2{
StringBuilder sb = new StringBuilder();
long start = System.currentTimeMillis();
int value_table[] = {2, 5, 4, 4, 1, 6, 5, 5, 1, 7, 6, 3, 5, 2, 3, 5, 7, 2, 1, 2, 4, 6, 6, 7, 5, 7};
int sample[] = new int[26];
ArrayList<word> all_string = new ArrayList<word>();
ArrayList<word> length_of_3 = new ArrayList<word>();
ArrayList<word> length_of_4 = new ArrayList<word>();
int max = -1;
void solver() throws IOException{
BufferedReader reader = new BufferedReader(new FileReader("lgame.in"));
String x = reader.readLine();
for(int i=0;i<x.length();i++){
sample[x.charAt(i)-'a']++;
}
BufferedReader reader1 = new BufferedReader(new FileReader("lgame.dict"));
while(true){
String tmp = reader1.readLine();
if(tmp.length()<3) break;
int sum=0;
boolean flag = true;
int tmp_arr[] = new int[26];
for(int i=0;i<tmp.length();i++){
int ttt = tmp.charAt(i)-'a';
sum+=value_table[ttt];
tmp_arr[ttt]++;
if(tmp_arr[ttt]>sample[ttt]){
flag=false;
break;
}
}
word d = new word(tmp, sum);
if(flag){
max = sum>max?sum:max;
if(tmp.length()==3){
length_of_3.add(d);
}else if(tmp.length()==4){
length_of_4.add(d);
}
all_string.add(d);
}
}
HashMap<String, Integer> map = new HashMap<String, Integer>();
for(int i=0;i<length_of_3.size();i++){
word s1 = length_of_3.get(i);
for(int j=0;j<length_of_3.size();j++){
word s2 = length_of_3.get(j);
int tmp_arr[] = new int[26];
boolean flag = true;
int sum = 0;
for(int k=0;k<3;k++){
int ttt1 = s1.s.charAt(k)-'a';
int ttt2 = s2.s.charAt(k)-'a';
tmp_arr[ttt1]++;
tmp_arr[ttt2]++;
if(tmp_arr[ttt1]>sample[ttt1]||tmp_arr[ttt2]>sample[ttt2]){
flag = false;
break;
}
sum+=value_table[ttt1];; sum+=value_table[ttt2];
}
if(flag){
max = sum>max?sum:max;
String ns = s1.s.compareTo(s2.s)<=0?s1.s+" "+s2.s:s2.s+" "+s1.s;
if(!map.containsKey(ns)){
map.put(ns, 1);
word d = new word(ns, sum);
all_string.add(d);
}
}
}
for(int j=0;j<length_of_4.size();j++){
word s2 = length_of_4.get(j);
int tmp_arr[] = new int[26];
boolean flag = true;
int sum = 0;
for(int k=0;k<3;k++){
int ttt1 = s1.s.charAt(k)-'a';
int ttt2 = s2.s.charAt(k)-'a';
tmp_arr[ttt1]++;
tmp_arr[ttt2]++;
if(tmp_arr[ttt1]>sample[ttt1]||tmp_arr[ttt2]>sample[ttt2]){
flag = false;
break;
}
sum+=value_table[ttt1]; sum+=value_table[ttt2];
}
int temp = s2.s.charAt(3)-'a';
tmp_arr[temp]++;
if(tmp_arr[temp]>sample[temp]) flag = false;
sum+=value_table[temp];
if(flag){
max = sum>max?sum:max;
String ns = s1.s.compareTo(s2.s)<=0?s1.s+" "+s2.s:s2.s+" "+s1.s;
if(!map.containsKey(ns)){
map.put(ns, 1);
word d = new word(ns, sum);
all_string.add(d);
}
}
}
}
sb.append(max).append("\n");
ArrayList<word> result = new ArrayList<word>();
for(int i=0;i<all_string.size();i++){
if(all_string.get(i).value==max){
result.add(all_string.get(i));
}
}
Collections.sort(result);
for(int i=0;i<result.size();i++){
sb.append(result.get(i).s).append("\n");
}
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("lgame.out")));
System.out.print(sb.toString());
pw.print(sb.toString());
pw.close();
System.out.println("$:"+(System.currentTimeMillis()-start));
System.exit(0);
}
}
public class lgame {
public static void main(String[] args) throws Exception {
problem2 p = new problem2();
p.solver();
}
}


前面那个求割点的图论不会做,图论基本没研究过,伤。。

然后看这个题貌似蛮好搞。 开始以为是DP, 但是DP复杂度貌似还是高了。

注意到给出的词最多只有7的长度,所以只有可能有3+3, 3+4这样的组合

然后就是把输入的长度为3和为4的组合枚举一遍, 并且算上之前的所有的单个词汇。

枚举所有求最大。

USACO这个难度差距有点太大, 前面一些迭代加深之类的搜索过难, 这个有点太无脑了吧, 难得一次过。。。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: