poj 1171 Letter Game

#include <iostream>
#include
<string>
using namespace std;
struct node
{
char words[10];
int len,val;
}dic[
40010];
int c_fre[26],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};
char coll[10],lett[10];
int to_value(char ch[])
{
int s=0;
for(int i=0;i<strlen(ch);++i)
s
+=value[ch[i]-97];
return s;
}
bool add(int list[],char ch[])
{
for(int i=0;i<strlen(ch);++i)
{
int tmp=ch[i]-97;
list[tmp]
++;
if(list[tmp]>c_fre[tmp])
return false;
}
return true;
}
int main()
{
int i,j;
scanf(
"%s",coll);
int c_v=to_value(coll),c_len=strlen(coll);
for(i=0;i<c_len;++i)
c_fre[coll[i]
-97]++;
int m_val=0,t=0,arr[26];
while(scanf("%s",lett)&&strcmp(lett,".")!=0)
{
int d_len=strlen(lett),w=to_value(lett);
if( d_len>c_len || w>c_v )
continue;
memset(arr,
0,sizeof(arr));
if(!add(arr,lett))
continue;
if(m_val<w) m_val=w;
if( (c_len==6&&d_len==3) || (c_len==7&&d_len<=4) )
//单词长度范围在3--7内.所以可能的词组只能是 3+3 或 3+4 ,最多只能由两个组成;也就是说那些长度大于4的词组不用存储
{
strcpy(dic[t].words,lett);
dic[t].len
=d_len;
dic[t].val
=w;
t
++;
}
}

if(c_len>=6&&m_val<c_v)
{
for(i=0;i<t;++i)
for(j=0;j<t;++j)
{
int i_v=dic[i].val,j_v=dic[j].val;
if( dic[i].len+dic[j].len>c_len || i_v+j_v>c_v )
continue;
memset(arr,
0,sizeof(arr));
if(!add(arr,dic[i].words))
continue;
if(!add(arr,dic[j].words))
continue;
m_val
=max(m_val,i_v+j_v);
}
}
printf(
"%d\n",m_val);
return 0;
}

  

posted on 2011-07-17 23:53  sysu_mjc  阅读(220)  评论(0编辑  收藏  举报

导航