hdu 4753 2013南京赛区网络赛 记忆化搜索 ****
看到范围基本可以想到dp了,处理起来有点麻烦
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
//edges[i][j]为边(i,j)的编号,marks[i]表示边i是横边还是竖边
int edges[][],marks[],p[];
//cont[i]为后添加的边在状态中是多少位,conp[i]为后面的状态中第i位为哪条边
int dp[],cont[],conp[],len;
//selected[i]表示第i条边是否在最开始已经选了
bool selected[];
void Init()
{
int cnt=;
memset(edges,,sizeof(edges));
memset(marks,,sizeof(marks));
memset(selected,,sizeof(selected));
for(int i=;i<;++i) dp[i]=-inf;
for(int i=;i<=;i+=)
{
for(int j=;j<;++j)
{
edges[i+j][i+j+]=edges[i+j+][i+j]=++cnt;
marks[cnt]=;
}
if(i==) break;
for(int j=;j<;++j)
edges[i+j][i+j+]=edges[i+j+][i+j]=++cnt;
}
for(int i=;i<;++i) p[i]=<<i;
}
inline bool check(int a,int b,int c,int state)
{
if(!selected[a]&&(p[cont[a]]&state)==) return false;
if(!selected[b]&&(p[cont[b]]&state)==) return false;
if(!selected[c]&&(p[cont[c]]&state)==) return false;
return true;
}
int getpoints(int e,int now)
{
int sum=;
int a,b,c;
if(marks[e])
{
a=e-;b=e-;c=e-;
if(c>&&check(a,b,c,now))
sum++;
a=e+;b=e+;c=e+;
if(a<&&check(a,b,c,now))
sum++;
}
else
{
a=e-;b=e-;c=e+;
if(marks[c]&&check(a,b,c,now))
sum++;
a=e-;b=e+;c=e+;
if(marks[a]&&check(a,b,c,now))
sum++;
}
return sum;
}
int f(int state)
{
if(state==p[len]-) return ;
if(dp[state]!=-inf) return dp[state];
dp[state]=;
int tmp=-inf;
for(int i=;i<len;++i)
{
if((p[i]&state)==)
tmp=max(tmp,getpoints(conp[i],state)-f(p[i]|state));
}
return dp[state]=tmp;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t,tcase=;
scanf("%d",&t);
while(t--)
{
tcase++;
Init();
int n,a,b,e,ans=,turns=;
scanf("%d",&n);
len=-n;
for(int i=;i<n;++i)
{
scanf("%d%d",&a,&b);
e=edges[a][b];
if(turns)
ans-=getpoints(e,);
else ans+=getpoints(e,);
turns^=;
selected[e]=true;
}
int cnt=;
for(int i=;i<=;++i)
if(!selected[i]) {conp[cnt]=i;cont[i]=cnt;cnt++;}
if(turns)
ans-=f();
else ans+=f();
printf("Case #%d: ",tcase);
if(ans>) puts("Tom200");
else puts("Jerry404");
}
return ;
}
hdu 4753 2013南京赛区网络赛 记忆化搜索 ****的更多相关文章
- hdu 4751 2013南京赛区网络赛 二分图判断 **
和以前做过的一个二分图颇为相似,以前的是互相不认识的放在一组,这个是互相认识的,本质上是相同的 是 hdu 2444 #include<cstdio> #include<iostre ...
- hdu 4753 Fishhead’s Little Game 博弈论+记忆化搜索
思路:状态最多有2^12,采用记忆化搜索!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm& ...
- hdu 4741 2013杭州赛区网络赛 dfs ***
起点忘记录了,一直wa 代码写的很整齐,看着很爽 #include<cstdio> #include<iostream> #include<algorithm> # ...
- hdu 4739 2013杭州赛区网络赛 寻找平行坐标轴的四边形 **
是平行坐标轴的,排个序搞一下就行了,卧槽,水的不行 如果不是平行的,则需要按照边长来判断
- hdu 4738 2013杭州赛区网络赛 桥+重边+连通判断 ***
题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥,使得这n座岛不连通,求最少要派多少人去. 处理重边 边在遍历的时候,第一个返回的一定是之前去的边,所以 ...
- hdu 4731 2013成都赛区网络赛 找规律
题意:找字串中最长回文串的最小值的串 m=2的时候暴力打表找规律,打表可以用二进制枚举
- HDU 1142 A Walk Through the Forest (记忆化搜索 最短路)
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- HDU 4444 Walk (离散化建图+BFS+记忆化搜索) 绝对经典
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4444 题意:给你一些n个矩形,给你一个起点,一个终点,要你求从起点到终点最少需要转多少个弯 题解:因为 ...
- HDU 4597 Play Game (DP,记忆化搜索)
Play Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total S ...
随机推荐
- HTML——meta标签
<meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. <meta> 标签位于文档的头部,不包含任何内容.&l ...
- hashCode与equals的区别与联系
一.equals方法的作用 1.默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一 ...
- LIGHTSWITCH 连接 MYSQL,中文字符不能保存----解决方法。
使用:dotConnect for MySQL () 作为 数据库连接的PROVIDER , 在 LIGHTSWITCH 中 引用外部的MYSQL 数据源. http://www.devart.co ...
- ls常用选项总结
参考: http://billie66.github.io/TLCL/book/index.html ls - List directory contents 选项 长选项 描述 -a --all 列 ...
- http get vs post
http get vs post GET与POST方法有以下区别:(1) 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到:POST方式,数据放置在HTML HEADER内提交.(2) ...
- qq开放平台测试
2015年3月10日 11:29:56 QQ API对一些链接的curl请求时, 有https, 所以需要安装openssl: Linux上要安装openssl #yum -y install op ...
- [Linux]yum开启rpm包缓存
在CentOS下用yum安装,回发现在/var/cache/yum/下的base.extrs和updates下的packages下都没有发现下载的RPM 原来在/etc/yum.conf下没有设置下载 ...
- ACM/ICPC 之 数论-素数筛选法 与 "打表"思路(POJ 1595)
何为"打表"呢,说得简单点就是: 有时候与其重复运行同样的算法得出答案,还不如直接用算法把这组数据所有可能的答案都枚举出来存到一个足够大的容器中去-例如数组(打表),然后再输入数据 ...
- Java for LintCode 链表插入排序
用插入排序对链表排序 解题思路: 最省时间的方法是使用优先级队列,但是无法通过,那就直接插入排序好了. public ListNode insertionSortList(ListNode head) ...
- 7.django之自定义分页记录
只是大概记录下步骤: 1.表结构: class UserProfile(models.Model): ''' 用户表 ''' user = models.OneToOneField(User,verb ...