罪犯审问 暴力+记忆化 SRM 672 div2 1000Tdetectived2
2015-11-07 17:04
351 查看
题意
抓小偷,先从目击者0开始,选择犯罪可能性最大的一个人,如果有多人相同,选择哪个都有可能。然后更新所有人的犯罪可能性。
问如果一个人是小偷,最少几轮能被发现。
题解
暴力枚举,状态压缩DP
两重循环计算每个人的在所有人中的最大怀疑值,若等于指定人则更新答案。
int n;
vector<string> s;
int memo[18][1<<18];
int f(int k, int mask)
{
int & res = memo[k][mask];
if (res == -1) {
int susp = -1;
int best_time = 0;
// get suspicions.
// for the maximum suspicion, remember the minimum time
for (int i = 1; i < n; i++) {
if ( !( (1<<i) & mask) ) {
int su = 0;
for (int j = 0; j < n; j++) {
if ( (1<<j) & mask) {
su = std::max<int>(su, s[j][i] - '0');
}
}
int t = 1 + ( (i == k)? 0 : f(k, mask | (1<<i) ) );
if (su > susp) {
// new maximum suspicion
susp = su;
best_time = t;
} else if ( (su == susp) && (best_time > t) ) {
// update minimum time
best_time = t;
}
}
}
res = best_time;
}
return res;
}
int reveal(vector<string> s)
{
// init memo table with -1s
memset( memo, -1, sizeof(memo) );
this->s = s;
n = s.size();
int res = 0;
for (int i = 0; i < n; i++) {
res += i * f(i, 1);
}
return res;
}
抓小偷,先从目击者0开始,选择犯罪可能性最大的一个人,如果有多人相同,选择哪个都有可能。然后更新所有人的犯罪可能性。
问如果一个人是小偷,最少几轮能被发现。
题解
暴力枚举,状态压缩DP
两重循环计算每个人的在所有人中的最大怀疑值,若等于指定人则更新答案。
int n;
vector<string> s;
int memo[18][1<<18];
int f(int k, int mask)
{
int & res = memo[k][mask];
if (res == -1) {
int susp = -1;
int best_time = 0;
// get suspicions.
// for the maximum suspicion, remember the minimum time
for (int i = 1; i < n; i++) {
if ( !( (1<<i) & mask) ) {
int su = 0;
for (int j = 0; j < n; j++) {
if ( (1<<j) & mask) {
su = std::max<int>(su, s[j][i] - '0');
}
}
int t = 1 + ( (i == k)? 0 : f(k, mask | (1<<i) ) );
if (su > susp) {
// new maximum suspicion
susp = su;
best_time = t;
} else if ( (su == susp) && (best_time > t) ) {
// update minimum time
best_time = t;
}
}
}
res = best_time;
}
return res;
}
int reveal(vector<string> s)
{
// init memo table with -1s
memset( memo, -1, sizeof(memo) );
this->s = s;
n = s.size();
int res = 0;
for (int i = 0; i < n; i++) {
res += i * f(i, 1);
}
return res;
}
相关文章推荐
- CNPI
- 在JSP中使用BootStrap
- Multiple Object Tracking using K-Shortest Paths Optimization简要
- Android TextView中\n不能正常换行的问题
- 如何复制list
- Android的init过程(二):初始化语言(init.rc)解析
- 不用root如何查看手机wifi密码
- 多线程指定ConcurrentHashMap定义了初始容量抛java.lang.OutOfMemoryError: Java heap space
- 虚拟键码表
- PowerShell实战 第五回 创建HAB
- 左右手系,坐标变换
- C# EXCEL表格处理相关函数
- 求x, 使x的平方为一个各位数字互不相同的9位数
- mysql数据库忘记密码时如何修改(本地)
- 关于php的array_diff和array_diff_assoc的使用总结
- Android的init过程详解(一)
- C++API设计
- hdu5536Chip Factory dfs+二分
- 大量excel文件批量转换成印刷pdf文件:两个小表格自动合成一页
- client sent invalid header line: "X-Hts_user: true" while reading client request headers