POJ 1171 Letter Game 解题思路

原题链接 http://acm.pku.edu.cn/JudgeOnline/problem?id=1171

版权声明版权归作者WeiSteven所有,转载请注明! 

 题目意思大致如下:

首先给你一个可用字符集,比如:prog

那么我们需要计算的单词,都是在这个集合内的元素,否则单词的权值是0

 

那么可以组成的单词rog pog rop等等

 

计算单词的最大权值,但是单词可以拼接起来。

但是拼接起来后还是要在可用集合中,且个数都不能超支。

 

下面是题目对用的程序:

代码
 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 struct words{ char word[8] ; int len , val ; } dic[40002];
 5 char collect[8] ;
 6 int used[26] , has[26] ,len , num , collect_max , tmax ;
 7 int value[26= {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};
 8 bool cmp( words p , words q ) {  return p.len<q.len;  }
 9 int main()
10 {
11  while( (collect[len]=getchar()) && collect[len]!='\n' )//输入 collected。并记录其score:collect_max ,len。
12  { collect_max+=value[collect[len]-'a'];  ++has[ collect[len]-'a' ];  ++len ; }
13  while( gets(dic[num].word) )
14  {
15   if( dic[num].word[0]=='.' ) break ;
16   int i = -1 ,sum = 0 ;
17   memset(used , 0 , 26*sizeof(int)) ;
18   while( dic[num].word[++i]!=0 )
19   { 
20    if++used[dic[num].word[i]-'a']>has[dic[num].word[i]-'a'] ) break;
21    sum += value[dic[num].word[i]-'a'] ;
22   }
23   if(dic[num].word[i]==0
24   { 
25    if(sum>tmax)  tmax=sum;
26    if( i<5) { dic[num].len=i; dic[num].val=sum; ++num; }
27   }
28  }
29  sort(dic,dic+num,cmp);
30  int len3=0,k;
31  for(int i=0;i<num;++i) if(dic[i].len<=3) len3=i;
32  for(int score=collect_max ; score>0 ; --score )
33  {
34   if(tmax==score) { printf("%d\n",score); return 0; }
35   for(int i=num-1;i>0;--i) 
36    for(int j=len3;j>=0;--j)
37    {
38     if(i==j) continue ;
39     memset(used , 0 , 26*sizeof(int)) ;
40     for(k=0;k<dic[i].len;++k) ++used[dic[i].word[k]-'a'];
41     for(k=0;k<dic[j].len;++k) 
42      if(++used[dic[j].word[k]-'a']>has[dic[j].word[k]-'a']) break;
43     if(k==dic[j].len&&score==dic[i].val+dic[j].val)
44     { printf("%d\n",score); return 0; }
45    }
46  }
47  return 0;
48 }
49 

 

 

posted @ 2010-08-12 00:47  Eric.wei  阅读(429)  评论(0编辑  收藏  举报