UVa 10400 - Game Show Math

原创 2016年05月30日 17:36:45

題目:已知一串數字,在數字直接添加四則運算(+-*/),優先級為左側優先,

            求是否能是的計算的結果為題目給定的數字(除法要餘數為零才能進行)。

分析:動態規劃、dp。利用dp從前向後地推。

            每次將當前所有可行解與下一個數字進行四種則運算,結果在範圍內即為新的可行解。

說明:好久沒做過dp了╮(╯▽╰)╭。

#include <cstring>
#include <cstdio>

#define formap(x) ((x)+32000)
#define revmap(x) ((x)-32000)
#define range(L, x, R) ((x) >= L && (x) <= R)

int  f[101][64004], p[101][64004], value[101];
char o[101][64004];

int save(int id, int v, int parent, char operat)
{
	f[id][v] = 1;
	p[id][v] = parent;
	o[id][v] = operat;
}

int output(int id, int v)
{
	if (id > 1) {
		output(id-1, p[id][v]);
		printf("%c%d",o[id][v],value[id]);
	}else {
		printf("%d",value[id]);
	}
}

int main()
{
	int n, m, ans;
	while (~scanf("%d",&n)) 
	while (n --) {
		scanf("%d",&m);
		for (int i = 1; i <= m; ++ i) {
			scanf("%d",&value[i]);
		}
		scanf("%d",&ans);
		
		memset(f, 0, sizeof(f));
		f[1][formap(value[1])] = 1;
		for (int i = 2; i <= m; ++ i) {
			for (int j = 0; j <= 64000; ++ j) {
				if (!f[i-1][j]) {
					continue;
				}
				if (range(-32000, revmap(j)+value[i], 32000)) {
					save(i, formap(revmap(j)+value[i]), j, '+');
				}
				if (range(-32000, revmap(j)-value[i], 32000)) {
					save(i, formap(revmap(j)-value[i]), j, '-');
				}
				if (range(-32000, revmap(j)*value[i], 32000)) {
					save(i, formap(revmap(j)*value[i]), j, '*');
				}
				if (revmap(j)%value[i]) {
					continue;
				}
				if (range(-32000, revmap(j)/value[i], 32000)) {
					save(i, formap(revmap(j)/value[i]), j, '/');
				}
			}
		}
		if (f[m][formap(ans)]) {
			output(m, formap(ans));
			printf("=%d\n",ans);
		}else {
			puts("NO EXPRESSION");
		}
	} 
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

uva 10400 - Game Show Math

#include #include #include #include #include #include #include #include #include #include ...
  • u010652938
  • u010652938
  • 2014年06月19日 12:57
  • 355

UVA - 10400 Game Show Math

#include #include int n, target, num[105], vis[105][64005], rec[105]; char str[5]= {"+-*/"}; boo...
  • kl28978113
  • kl28978113
  • 2014年10月15日 17:45
  • 1340

UVA 10400 - Game Show Math

看到题目,想到除了dfs枚举之外没有什么好方法了,但是最初我以为不需要判重,所以TLE,仔细想想,应该写一个vis[110][64000]的数组判重的,在cur时如果曾出现过sum的值,这个就不必再进...
  • anqier0468
  • anqier0468
  • 2013年06月13日 19:02
  • 402

UVA 10400 Game Show Math

题目翻译的链接 http://luckycat.kshs.kh.edu.tw/homework/q10400.htm 这题
  • u013776011
  • u013776011
  • 2014年04月17日 18:28
  • 265

uva 10400 Game Show Math

dfs题目,注意记录状态进行剪枝,否则会超时。 #include #include using namespace std; #define ADD 0 #define SUB 1 #...
  • xiaohaowudi
  • xiaohaowudi
  • 2013年11月18日 03:34
  • 454

UVa 10400 - Game Show Math

传送门UVa 10400 - Game Show Math
  • u014247806
  • u014247806
  • 2014年06月08日 17:03
  • 572

uva 10400 - Game Show Math

点击打开链接uva 10400 题目意思:     给定n个数和一个目标数,问我们能否找到一个表达式使得这n个数算出来最后的结果等于这个目标值,注意这里的所有运算的优先级一样,都是从左向右的...
  • cgl1079743846
  • cgl1079743846
  • 2012年08月23日 08:31
  • 1303

UVa 10400 - Game Show Math

链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=113&page=show_pro...
  • shuangde800
  • shuangde800
  • 2012年08月15日 00:31
  • 1507

uva 10400 Game Show Math

题意:满足表达式,用DFS记忆化搜索,把到当前运算符所得的结果记录下来,起初用回溯一直错#include #include #include #include using namespace ...
  • u011345136
  • u011345136
  • 2013年08月30日 19:12
  • 613

10400 - Game Show Math

用状态数组来剪枝的一种方法# include# include # include int dfs(long ans,int cur); int range(long a); long number...
  • u014111471
  • u014111471
  • 2014年03月14日 19:47
  • 937
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVa 10400 - Game Show Math
举报原因:
原因补充:

(最多只允许输入30个字)