题目:https://www.luogu.org/problemnew/show/P2593

DP的话,考虑到当前这一位只跟前两位有关,所以记录一下这3位的状态就行;

于是一开始记录的第 i 位,i-1 位的数量,i-2 位的数量,是否有过对子,然后可行性DP;

但是写得太丑,又WA又T...

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[];
bool f[][][][];
int rd()
{
int ret=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return ret*f;
}
int main()
{
scanf("%d",&n);
while(n--)
{
memset(a,,sizeof a);
memset(f,,sizeof f);
for(int i=;i<=;i++)a[i]=rd();
f[][][][]=;
for(int i=;i<=;i++)
for(int j=;j<=(i->?a[i-]:);j++)
for(int k=j;k<=(i->?a[i-]:);k++) if(f[i-][j][k][]||f[i-][j][k][])
{
if(a[i]>=j)f[i][k-j][a[i]-j][]=f[i-][j][k][];
if(a[i]>=j)f[i][k-j][a[i]-j][]=f[i-][j][k][];
if(a[i]-j>=&&f[i-][j][k][])f[i][k-j][a[i]-j-][]=;
for(int l=;a[i]-j>=*l;l++)
{
if(a[i]-j>=*l)
{
f[i][k-j][a[i]-j-*l][]=f[i-][j][k][];
f[i][k-j][a[i]-j-*l][]=f[i-][j][k][];
}
if(a[i]-j>=*l)
{
f[i][k-j][a[i]-j-*l][]=f[i-][j][k][];
f[i][k-j][a[i]-j-*l][]=f[i-][j][k][];
}
}
}
if(f[][][][])printf("Yes\n");
else printf("No\n");
}
return ;
}

于是放弃这个写法了...

看到TJ,记录的是第 i 位和第 i-1 位的数量,这样就可以同层转移啦!于是简洁好多;

但总感觉复杂度有点不对啊,这样最高不是 10^8 吗...总之加上 register 就卡过去了。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[];
bool f[][][][];
int rd()
{
int ret=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return ret*f;
}
int main()
{
n=rd();
while(n--)
{
memset(f,,sizeof f);
for(register int i=;i<=;i++)a[i]=rd();
f[][][][]=;
for(register int i=;i<=;i++)
for(register int j=;j<=(i->?a[i-]:);j++)
for(register int k=;k<=a[i];k++)
{
if(k>=)f[i][j][k][]|=f[i][j][k-][];//可以同层转移囧
if(k>=)f[i][j][k][]|=f[i][j][k-][],f[i][j][k][]|=f[i][j][k-][];
if(k>=)f[i][j][k][]|=f[i][j][k-][],f[i][j][k][]|=f[i][j][k-][];
if(k<=j&&k<=a[i-])f[i][j][k][]|=f[i-][a[i-]-k][j-k][],
f[i][j][k][]|=f[i-][a[i-]-k][j-k][];
}
if(f[][a[]][a[]][])printf("Yes\n");
else printf("No\n");
}
return ;
}

洛谷P2593 [ ZJOI 2006 ] 超级麻将 —— DP的更多相关文章

  1. [ZJOI 2006]超级麻将

    Description Input 第一行一个整数N(N<=100),表示玩了N次超级麻将. 接下来N行,每行100个数a1..a100,描述每次玩牌手中各种牌的数量.ai表示数字为i的牌有ai ...

  2. 洛谷 P2585 [ ZJOI 2006 ] 三色二叉树 —— 树形DP

    题目:https://www.luogu.org/problemnew/show/P2585 首先,三色其实记录两种状态:是绿色,不是绿色 即可,因为红蓝可以随意取反: 一开始因为懒得还原出树,所以写 ...

  3. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  4. 洛谷 P3177 [HAOI2015]树上染色 树形DP

    洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...

  5. 洛谷 P4072 [SDOI2016]征途 斜率优化DP

    洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...

  6. 洛谷P1063 能量项链(区间DP)(环形DP)

    To 洛谷.1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的 ...

  7. 洛谷P1880 石子合并(区间DP)(环形DP)

    To 洛谷.1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1 ...

  8. 洛谷P1282 多米诺骨牌 (DP)

    洛谷P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中 ...

  9. 洛谷 P5469 - [NOI2019] 机器人(区间 dp+拉格朗日插值)

    洛谷题面传送门 神仙题,放在 D1T2 可能略难了一点( 首先显然对于 P 型机器人而言,将它放在 \(i\) 之后它会走到左边第一个严格 \(>a_i\) 的位置,对于 Q 型机器人而言,将它 ...

随机推荐

  1. 整合springboot,angular2,可以前后台交互数据

    改造了一下angular2官方文档中的hero项目,让其可以进行后台的交互, https://github.com/DACHUYIN 源码在上面...博客就不写了....

  2. JS高级——Function

    Function构造函数 可以用来新建函数对象 1.一个参数都不传的情况创建的就是一个空的函数 2.只传一个参数的情况这个参数就是函数体 3.传多个参数的情况,最后一个参数为函数体,前面的参数都是该函 ...

  3. 移动web——bootstrap模板

    基本概念 1.bootstrap就是在媒体查询技术出现以后才开始出现的 2.此技术使响应式开发变得十分轻松,最大特点就是栅格系统(什么设备上如何显示)以及响应式工具(是否可见) 基本模板 <!D ...

  4. JS——if条件判断

    现在只说特殊情况: 1.一个变量,例如n1=null <script> var n1 = null; alert(n1);/*弹窗的值为null*/ if (n1 == null) {/* ...

  5. 【译】x86程序员手册16-5.3联合使用段与分页转换

    5.3 Combining Segment and Page Translation  联合使用段与分页转换 Figure 5-12 combines Figure 5-2 and Figure 5- ...

  6. jboss启动问题

    今天一大早客户找我,说他们那边的jboss启动成功了,但是却访问不了. 本以为不是什么事,估计又是客户不会搞,把哪里搞挂了,直接远程把客户的jboss的log.data.tmp等文件给清理了,然后重启 ...

  7. matlab数值数据的表示方法,输出数据以及相关函数

    数据类型的分类: 1.整型 无符号整型和带符号整形 带符号整形的最大值是127 >>x=int8(129) 输出结果是x=127 >>x=unit8(129) 输出结果是x=1 ...

  8. IDEA生成增强for循环

    itar 生成array for代码块 for (int i = 0; i < array.length; i++) { = array[i]; } itco 生成Collection迭代 fo ...

  9. python编写webservice接口

    1.pip install suds-jurko 2.pip install client #coding=utf-8 from suds.client import Client class Web ...

  10. 观察者模式之Golang实现

    观察者模式的具体概念原理,参见https://baike.baidu.com/item/%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/5881786?fr ...