URAL 1002|Phone Numbers|动态规划
来源:互联网 发布:最新网络术语 编辑:程序博客网 时间:2024/05/17 07:45
http://acm.timus.ru/problem.aspx?space=1&num=1002
题目翻译
现代社会中,你常常会遇到一大堆电话号码,而且这些号码正在变得越来越长,你却需要记住这些号码。一种简易的解决方法是建立数字与字母的对应关系,比如下面这种:
1 ij 2 abc 3 def4 gh 5 kl 6 mn7 prs 8 tuv 9 wxy 0 oqz
这样一个数字关联一些字母,这样你可以通过记单词的方式记忆号码。显然如果能找到号码与单词之间的简单的联系是坠吼的。比如你的一个棋友的电话号码是941837296,你可以读作WHITEPAWN,你最喜欢的老师的电话号码是2855304,则可以读作BULLDOG。
你需要写一个程序,找出单词数目最少的一组单词,其可以表示对应的电话号码。对应关系如上。
输入
输入包含多组测试数据。对于每组数据,第一行电话号码,第二行一个正整数
输出
对于每组数据,输出一行,如果存在这样的一种表示方式,则输出对应的句子,如果存在多种句子符合条件,输出单词数目最少的那个,如果还存在多种句子符合条件,随便输出一种。如果不存在,输出”No solution.”。
样例输入
73251890875ityourrealityrealour42949672965ityourrealityrealour-1
样例输出
reality ourNo solution.
题解
令
那么显然有
其中
mapped_word
表示单词对应的号码是多少。#include <cstdio>#include <cstring>#define FOR(i,j,k) for(i=j;i<=k;++i)#define rep(i,j,k) for(i=j;i<k;++i)const char map[] = "22233344115566070778889990";char s[128], word[65536][64];int len[65536], dp[128], sel[128];void output(int n) { if (n == 0) return; else output(n - len[sel[n]]); printf("%s ", word[sel[n]] + 1);}int main() { int i, j, k, n, l; while (scanf("%s", s + 1) != EOF && s[1] != '-') { scanf("%d", &n); l = strlen(s + 1); memset(dp, 127, sizeof dp); dp[0] = 0; FOR(i,1,n) scanf("%s", word[i] + 1), len[i] = strlen(word[i] + 1); FOR(j,1,l) FOR(i,1,n) if (j >= len[i]) { bool flag = true; FOR(k,1,len[i]) if (s[j - len[i] + k] != map[word[i][k] - 'a']) { flag = false; break; } if (!flag) continue; if (dp[j] > dp[j - len[i]] + 1) { dp[j] = dp[j - len[i]] + 1; sel[j] = i; } } if (dp[l] == 0x7f7f7f7f) puts("No solution."); else output(l), putchar('\n'); }}
阅读全文
0 0
- URAL 1002|Phone Numbers|动态规划
- ural 1002 Phone numbers
- ural 1002 phone numbers
- URAL 1002 Phone Numbers
- 【动态规划】Phone Numbers
- ural 1002 Phone Numbers 字典树+dp
- ural 1002 Phone Numbers 字典树+dp
- URAL 1002. Phone Numbers
- timus 1002. Phone Numbers(KMP&动态规划)
- URAL 1009|URAL 1012|URAL 1013|K-based Numbers|高精度|动态规划
- URAL 1009 K-based Numbers (DP动态规划)
- 动态规划 URAL 2018
- ural 1002. Phone Numbers tire+spfa
- Ural 1002 Phone number
- URAL 1119 Metro (动态规划)
- URAL 1017|Staircases|动态规划
- 动态规划--Humble Numbers
- UVa944 - Happy Numbers(动态规划)
- Linux必学命令-文件处理类命令
- Travis.ci
- poj 2763(树链剖分)边剖(树状数组版)
- 决策树
- POJ 2524--Ubiquitous Religious
- URAL 1002|Phone Numbers|动态规划
- codeforces 546E. Soldier and Traveling 网络流
- CorelDraw应该怎么样才能学好描图技巧看看这个就能懂
- 试题3:二维数组中的查找
- java中的访问权限
- Spark Streaming基于状态、窗口的实时数据流
- java中的多线程深入探究
- hdu 1019 Least Common Multiple 最小公倍数
- Spring中Bean及@Bean的理解