BZOJ1860&&洛谷P2593 [ZJOI2006]超级麻将

玄学dp

我们不难发现,一个位置的影响只有他前面一位和他后面以为,然后我们就可以枚举一下第i位,i-1位,i-2位分别打出了多少牌,然后,之前的牌里有没有打出过(对),然后暴力转移就行了,因为我们只关心状态是否可以达到,所以用bool数组,|=就好了,不然会TLE

代码

//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=150;
int n,pa[M];
bool f[M][M][M][2];
signed main()
{
	scanf("%d",&n);
	while (n--)
	{
		for (int i=1;i<=100;i++) scanf("%d",&pa[i]);
		memset(f,0,sizeof(f));f[0][0][0][0]=1;
		for (int i=1;i<=100;i++)
		for (int k=0;k<=pa[i-1];k++)
		for (int j=0;j<=pa[i];j++)
		{
			if (j>1) f[i][k][j][1]|=f[i][k][j-2][0];
			if (j>2) f[i][k][j][1]|=f[i][k][j-3][1],f[i][k][j][0]|=f[i][k][j-3][0];
			if (j>3) f[i][k][j][1]|=f[i][k][j-4][1],f[i][k][j][0]|=f[i][k][j-4][0];
			if (k>=j&&pa[i-2]>=j) f[i][k][j][0]|=f[i-1][pa[i-2]-j][k-j][0],f[i][k][j][1]|=f[i-1][pa[i-2]-j][k-j][1];
		}
		f[100][pa[99]][pa[100]][1]?puts("Yes"):puts("No");
	}
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值