4325. 【NOIP2015提高组Day1】斗地主
2018-01-21 15:50
148 查看
4325. 【NOIP2015提高组Day1】斗地主
https://jzoj.net/senior/#main/show/432515年提高组的题,看到标题我吓了一跳,但细细分析来,还是可以做的。
过流程(题目描述):
大致是说给你一些牌,按照上述出牌方式,最少几步可以出完所有牌。
一开始就想到了很平常的方法——dfs,但我们发现直接暴力会T,于是,观察数据:n是固定的,所以这题会有很多状态是一样的,我们便自然的想到了预处理。
首先看,除顺子外,其他出牌方式对点数都没有要求,只对数量有要求,所以大致的思路就是先预处理没有顺子的情况的出牌步数,然后暴力求顺子的状况,O(1)求解。
我们设f[i][j][k][l]表示还剩i种牌有4张,j种牌有3张,k种牌有2张,l种牌有1张的最小出牌步数。
于是就有除顺子外的9种转移:
int did(int a,int b,int c,int d) { int ss=a+b+c+d; if (d>=1) ss=min(ss,f[a][b][c][d-1]); if (b>=1 && c>=1) ss=min(ss,f[a][b-1][c-1][d]); if (b>=1 && d>=1) ss=min(ss,f[a][b-1][c][d-1]); if (c>=1) ss=min(ss,f[a][b][c-1][d]); if (b>=1) ss=min(ss,f[a][b-1][c][d]); if (a>=1) ss=min(ss,f[a-1][b][c][d]); if (a>=1 && d>=2) ss=min(ss,f[a-1][b][c][d-2]); if (a>=1 && c>=2) ss=min(ss,f[a-1][b][c-2][d]); if (a>=1 && c>=1) ss=min(ss,f[a-1][b][c-1][d]); } ...... { f[0][0][0][0]=0; for (i=0;i<=n;i++) for (j=0;j<=n;j++) for (k=0;k<=n;k++) for (l=0;l<=n;l++) f[i][j][k][l]=min(did(i,j,k,l)+1,f[i][j][k][l]); }
在此之后,我们可以递归1~3顺子的情况,每一种状态更新答案即可。
相关文章推荐
- 【jzoj4325】【NOIP2015提高组Day1】【斗地主】
- NOIP 2015 提高组 Day1 斗地主
- NOIP2015复赛提高组day1(A:神奇的幻方 B:信息传递 C:斗地主)
- C++——NOIP2015提高组day1 t3——斗地主
- JZOJsenior4325、luoguP2668.【NOIP2015提高组Day1】斗地主
- 【NOIP2015提高组Day1】斗地主
- JZOJsenior4324.【NOIP2015提高组Day1】信息传递
- NOIP 2015 提高组 Day1 信息传递
- NOIP 2015 提高组 Day1 T1 神奇的幻方
- [BZOJ 4325][NOIP 2015] 斗地主
- NOIP2015 提高组 复赛 day1 message 信息传递
- 【NOIP2015提高组Day1】信息传递
- BZOJ_4325_NOIP2015 斗地主_DFS
- 【BZOJ4325】NOIP2015 斗地主【搜索】【剪枝】
- bzoj 4325 NOIP2015 斗地主 (dfs)
- BZOJ 4325: NOIP2015 斗地主 爆搜
- NOIP2015 提高组 day1 神奇的幻方
- 【bzoj4325】NOIP2015 斗地主(&“加强”版) 搜索
- NOIP2015提高组day1 —— 信息传递(message)
- 【BZOJ4325】NOIP2015 斗地主 搜索+贪心