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 ...
随机推荐
- 介绍 .Net工具Code Snippet 与 Sql Server2008工具SSMS Tools Pack
不久前,某某在微软写了一个很酷的工具:Visual Stuido2008可视化代码片断工具,这个工具可以在http://www.codeplex.com/SnippetDesigner上免费下载,用它 ...
- 【leetcode】Path Sum II
Path Sum II Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals ...
- mysql日常语句总结
#删除mysql的二进制日志文件 #将删除mysql-bin.*****1之前的日志文件 purge binary logs to 'mysql-bin.*****1'; #重新生成一个二进制日志文件 ...
- Win7下同时使用有线和无线时的优先级设置
终于找到这个问题的解决方案了!!!!我是通过方法1改跃点数实现的,方法2无效. http://linshengling.blog.163.com/blog/static/114651912012102 ...
- 7.SpringMVC注解优化
新建controller,每个人都可以建自己的controller,比较方便,不用再在web.xml中进行配置,value的请求地址一定要唯一. 优化: 1.上面示例中spring-annotatio ...
- SuSE Linux 开启VNC服务
一.启动VNC服务输入命令 vncserver 二.编辑启动脚步vi /root/.vnc/xstartup 把twm &注释改为#twm & 然后再最下面增加2行startgnom ...
- js简单分页,可用
//翻页调用 var pageSize = 1; var counts = 1; var current_page = 1; var rows,total; search(); //查询所有 func ...
- 手把手教你实现折线图之------安卓最好用的图表库hellocharts之最详细的使用介绍
因为项目需要搞一个折线图,按照日期显示相应的成绩,所以有了本文. 以前用过一次XCL-chart,但是感觉只适合固定图表,不去滑动的那种,因为你一滑动太卡了你懂得(毕竟作者好久没更新优化了),拙言大神 ...
- 【OpenCV】直方图
今天写直方图,学了几个相关函数 1. mixChannels void mixChannels(const Mat* src, int nsrc, Mat* dst, int ndst, const ...
- osgearth使用prjected投影
In projected mode, you have to specify a map profile (i.e. a map projection). You also need to tell ...