您的位置:首页 > 其它

UVALive 6163 - Myth Busters

2013-08-20 10:13 399 查看
    状态压缩dp。

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<sstream>
#include<vector>
#include<string>
#include<bitset>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define FF(i, a, b) for(int i=a; i<b; i++)
#define REP(i, n) for(int i=0; i<n; i++)
#define FD(i, a, b) for(int i=a; i>=b; i--)
#define CLR(a, b) memset(a, b, sizeof(a))
#define debug puts("**debug**")
#define PB push_back
#define LL long long

const int N = 11111;

using namespace std;

set <int> dp[17];
set <int> :: iterator lt;
set <int> :: iterator kt;

bool get(char tmp[])
{
int i, j, k, l;
i = 0;
for(i = 0; i < 16; i ++) dp[i].clear();
for(i = 0; i < 4; i ++)
{
dp[(1 << i)].insert(tmp[i] - '0');
}
for(i = 1; i < 16; i ++)
{
for(j = 1; j < i; j ++)
{
if((i & j) == j)
{
for(kt = dp[i-j].begin(); kt != dp[i-j].end(); kt++)
{
for(lt = dp[j].begin(); lt != dp[j].end(); lt++)
{
k = *kt, l = *lt;
dp[i].insert(k + l);
dp[i].insert(k * l);
dp[i].insert(abs(l - k));
if(l) dp[i].insert(k / l);
if(k) dp[i].insert(l / k);
}
}
}
}
}
return dp[15].count(10);
}
int main()
{
//freopen("input.txt", "r", stdin);
int n, i, j, flag;
char tmp[6];
while(cin >> n, n)
{
flag = 1;
while(n --)
{
cin >> tmp;
if(!get(tmp)) flag = 0;
}
if(flag) cout << "TRUE" << endl;
else cout << "BUSTED" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息