您的位置:首页 > 其它

ural 1002 phone numbers

2011-01-30 12:30 274 查看
这是一道动归题, 算法复杂度为 O(n*len).

]#include<iostream>
using namespace std;
const int MAX=10000;
char str[105];
int n;
char s[50002][55];
int f[105][2];
int l,len[50002];
int T[26]={2,2,2,3,3,3,4,4,1,1,5,5,6,6,0,7,0,7,7,8,8,8,9,9,9,0};
///////////a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
int cmp(int j,int i)
{
int t;
for(t=0;t<len[j];t++)
{
if(str[i+1-len[j]+t]-'0'!=T[s[j][t]-'a']) return 0;
}
return 1;
}
void print(int i)
{
if(i<=0) return;
print(i-len[f[i][1]]);
printf("%s",s[f[i][1]]);
if(i!=l-1) printf(" ");
else printf("/n");
return;
}
int main()
{
int i,j,k;
while(scanf("%s",str)&&str[0]!='-')
{
l=strlen(str);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%s",s[i]);
len[i]=strlen(s[i]);
}
for(i=0;i<l;i++)
{
f[i][0]=MAX;
for(j=1;j<=n;j++)
{
if(len[j]>i+1) continue;
if(len[j]==i+1)
{
if(cmp(j,i))
{
f[i][0]=1;
f[i][1]=j;
}
}
else if(cmp(j,i))
{
if(f[i-len[j]][0]+1<f[i][0])
{
f[i][0]=f[i-len[j]][0]+1;
f[i][1]=j;
}
}
}
}
if(f[l-1][0]==MAX) printf("No solution./n");
else
{
print(l-1);
}
memset(s,0,sizeof(s));
memset(f,0,sizeof(f));
memset(str,0,sizeof(str));
memset(len,0,sizeof(len));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: