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 ...
随机推荐
- IDEA 配置 tomcat 启动内存
-server -XX:PermSize=128M -XX:MaxPermSize=256m
- CentOS6.5安装Tab增强版:bash-completion
CentOS6.5安装Tab增强版:bash-completion,可补全命令参数: 因为CentOS官方源并不带有bash-completion的包,所以,为了可用yum安装,增加epel的源, 首 ...
- Angularjs与bootstrap.datetimepicker结合实现日期选择器
http://www.lovelucy.info/angularjs-best-practices.html http://damoqiongqiu.iteye.com/blog/1917971 ht ...
- sharepoint2013隐藏左侧导航栏更换新的
$("#zz16_V4QuickLaunchMenu").hide()//隐藏 更换新的 <script type="text/javascript" s ...
- poj 2524 (并查集)
http://poj.org/problem?id=2524 题意:在一所学校里面的人,都有宗教信仰,不过他们的宗教信仰有可能相同有可能不同,但你又不能直接去问他们,但你可以问他们和谁是同一个宗教.通 ...
- POJ 3740
http://poj.org/problem?id=3740 这是一道搜索+回溯的题目,也是我第一次接触到回溯. 题意就是找一些行,这些行可以使每一列都只存在一个1. 深搜加回溯: memory:11 ...
- 一个不错的定位API网站
2015年5月2日 15:36:31 星期六 http://www.haoservice.com/
- Java for LeetCode 228 Summary Ranges
Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...
- 7.django之自定义分页记录
只是大概记录下步骤: 1.表结构: class UserProfile(models.Model): ''' 用户表 ''' user = models.OneToOneField(User,verb ...
- codeforces 425C Sereja and Two Sequences(DP)
题意读了好久才读懂....不知道怎么翻译好~~请自便~~~ http://codeforces.com/problemset/problem/425/C 看懂之后纠结好久...不会做...仍然是看题解 ...