洛谷 2668&2540 斗地主——搜索+贪心+dp
题目:https://www.luogu.org/problemnew/show/P2540
发现如果没有顺子,剩下的可以贪心。所以搜索顺子怎么出,然后贪心。
这样只能过不加强版。原因是贪心的时候难以弄3=1+2。3应该是 3带* 还是拆开让4带上?
如这个数据(×后面是个数):3×3,4×1,6×4,7×3,9×1,10×2,11×1,12×4,13×3
正解应该是把一个3拆成1+2,然后两次4带2,两次3带2。但贪心似乎做不了。
所以应该dp!记录1,2,3,4,王各有几个,就能把“拆”体现在状态转移里了。
自己以“还剩几张牌”为阶段,“拆”就是同层转移了;所以需要注意枚举的顺序,保证先同层转移到自己,再从自己转移。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=;
int T,n,a[N][M],nm[],dp[N][N>>][N/][N>>][],fg,ans;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return fx?ret:-ret;
}
void Mn(int &x,int y){x=min(x,y);}
void calc(int cr)
{
memset(dp,0x3f,sizeof dp); memset(nm,,sizeof nm);
for(int i=;i<=;i++)nm[a[cr][i]]++;
dp[nm[]][nm[]][nm[]][nm[]][fg]=;
int lm1=n,lm2=n>>,lm3=n/,lm4=(n>>);
for(int sm=nm[]+(nm[]<<)+nm[]*+(nm[]<<)+fg;sm>=;sm--)
for(int l=lm4;l>=;l--)
for(int k=lm3;k>=;k--)
for(int j=lm2;j>=;j--)
for(int t=;t<=;t++)
{
int i=sm-(j<<)-k*-(l<<)-t; if(i<)continue;
int d=dp[i][j][k][l][t]; if(d>n-cr)continue;
if(l)Mn(dp[i+][j][k+][l-][t],d);//4=1+3
if(l)Mn(dp[i][j+][k][l-][t],d);//4=2+2
if(k)Mn(dp[i+][j+][k-][l][t],d);//3=1+2
if(j)Mn(dp[i+][j-][k][l][t],d);//2=1+1 d++;
if(l&&i>=)Mn(dp[i-][j][k][l-][t],d);
if(l&&i&&t)Mn(dp[i-][j][k][l-][t-],d);
if(l&&t>=)Mn(dp[i][j][k][l-][],d);
if(l&&j>=)Mn(dp[i][j-][k][l-][t],d); if(k&&j)Mn(dp[i][j-][k-][l][t],d);
if(k&&i)Mn(dp[i-][j][k-][l][t],d);
if(k&&t)Mn(dp[i][j][k-][l][t-],d); if(i)Mn(dp[i-][j][k][l][t],d);
if(j)Mn(dp[i][j-][k][l][t],d);
if(k)Mn(dp[i][j][k-][l][t],d);
if(l)Mn(dp[i][j][k][l-][t],d);
if(t==)Mn(dp[i][j][k][l][t-],d);
if(t==)Mn(dp[i][j][k][l][],d);
}
ans=min(ans,cr+dp[][][][][]);
}
void solve(int cr)
{
if(cr>ans)return;
memcpy(a[cr],a[cr-],sizeof a[cr-]);
for(int i=,j;i<=;i++)
if(a[cr][i]>=&&a[cr][i+]>=)
{
a[cr][i]-=;
for(j=i+;j<=&&a[cr][j]>=;j++)
a[cr][j]-=;
for(j--;j>=i+;j--) solve(cr+),a[cr][j]+=;
a[cr][i]+=;
}
for(int i=,j;i<=;i++)
if(a[cr][i]>=&&a[cr][i+]>=&&a[cr][i+]>=)
{
a[cr][i]-=;a[cr][i+]-=;
for(j=i+;j<=&&a[cr][j]>=;j++)
a[cr][j]-=;
for(j--;j>=i+;j--) solve(cr+),a[cr][j]+=;
a[cr][i+]+=;a[cr][i]+=;
}
for(int i=,j;i<=;i++)
if(a[cr][i]&&a[cr][i+]&&a[cr][i+]&&a[cr][i+]&&a[cr][i+])
{
a[cr][i]--;a[cr][i+]--;a[cr][i+]--;a[cr][i+]--;
for(j=i+;j<=&&a[cr][j];j++)
a[cr][j]--;
for(j--;j>=i+;j--) solve(cr+),a[cr][j]++;
a[cr][i+]++;a[cr][i+]++;a[cr][i+]++;a[cr][i]++;
}
calc(cr-);
}
int main()
{
T=rdn(); n=rdn();
while(T--)
{
ans=N;
memset(a[],,sizeof a[]); fg=;//!
for(int i=,u,v;i<=n;i++)
{
u=rdn(); v=rdn();
if(u)a[][u<=?u+:u-]++;
else fg++;
}
solve();
printf("%d\n",ans);
}
return ;
}
洛谷 2668&2540 斗地主——搜索+贪心+dp的更多相关文章
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷 2921 记忆化搜索 tarjan 基环外向树
洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...
- 洛谷 P3177 [HAOI2015]树上染色 树形DP
洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...
- 洛谷 P4072 [SDOI2016]征途 斜率优化DP
洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...
- 洛谷P1282 多米诺骨牌 (DP)
洛谷P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中 ...
- 洛谷P1880 石子合并(区间DP)(环形DP)
To 洛谷.1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1 ...
- 洛谷P1063 能量项链(区间DP)(环形DP)
To 洛谷.1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的 ...
- 洛谷P1074 靶形数独 [搜索]
题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...
- 【洛谷 P1667】 数列 (贪心)
题目链接 对于一个区间\([x,y]\),设这个区间的总和为\(S\) 那么我们在前缀和(设为\(sum[i]\))的意义上考虑到原操作其实就是\(sum[x−1]+=S\) , \(sum[x]+S ...
随机推荐
- 【环境配置】Linux的经常使用命令
系统信息 arch 显示机器的处理器架构uname -m 显示机器的处理器架构uname -r 显示正在使用的内核版本号 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) ...
- jquery的一点点认识
概述 JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 .它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, O ...
- 使用 Navicat 8.0 管理mysql数据库(导出导入数据)
http://dxcns.blog.51cto.com/1426423/367105 使用Navicat For MySql 将mysql中的数据导出,包括数据库表创建脚本和数据 (1)数据的导出:右 ...
- 虚幻4Matinee功能 基本概念及简单演示样例(Sequence编辑器)
虚幻4提供的Matinee功能十分强大,能够用来制作动画.录制视频. 它的核心想法是在Matinee编辑器内提供一套自己的时间坐标系,在这个相对时间内通过调节actor的属性来改变actor的状态,进 ...
- Linux Kernel Maintainers
http://en.wikipedia.org/wiki/Ingo_Molnár http://zh.wikipedia.org/wiki/英格·蒙內 Ingo Molnár Ingo Molnár, ...
- Server.xml配置详解
<Server port="8005" shutdown="SHUTDOWN"> <!-- 属性说明 port:指定一个端口,这个端口负责监听 ...
- 2016/07/07 PHP的线程安全与非线程安全版本的区别
Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...
- 使用kbmmw 的调度事件动态显示时间
kbmmw 里面提供了强大的事件调度功能,今天简单演示一个使用调度事件在窗体上显示时间. 建立一个新工程. 放上几个控件 在窗体里面引用单元 kbmMWScheduler, 然后添加过程 unit U ...
- LeetCode算法题目解答汇总(转自四火的唠叨)
LeetCode算法题目解答汇总 本文转自<四火的唠叨> 只要不是特别忙或者特别不方便,最近一直保持着每天做几道算法题的规律,到后来随着难度的增加,每天做的题目越来越少.我的初衷就是练习, ...
- JAVA with Cassandra
maven项目,在pom.xml里加入依赖.不是的话下载相应的jar包放到lib目录下.这里驱动包的版本要和你cassandra的大版本一致. <dependency> <group ...