[BZOJ5248][多省联测2018]双木棋chess
2018-04-06 22:47
225 查看
bzoj
luogu
这样放旗子状态就会是一个自左下至右上的轮廓线。
状态数?
跟\(yyb,ppl\)讨论了一下状态数理论上应该是\(C_{20}^{10}\)啊。
然而。。。
这里打表打的就是\(10\)个\([0,10]\)整数单调不降的方案数。
运行结果:
\(???\)
状态数只有这么点?
我目前还不知道为什么。
但是既然状态数这么少就直接\(hash\)一下然后\(map\)存啊。
把既然是\([0,10]\)的整数就把它压成一个\(11\)进制的数,显然并不会爆long long。
可以直接\(dp\)。判断一下当前状态是先手还是后手进行操作,如果是先手操作就是从所有后继状态的\(dp\)值中取\(\max\),否则就是取\(\min\)。
luogu
sol
首先,要保证一个格子的左边和上方都放满了棋子,就需要这个点的左上方那个矩形都放满了棋子。这样放旗子状态就会是一个自左下至右上的轮廓线。
状态数?
跟\(yyb,ppl\)讨论了一下状态数理论上应该是\(C_{20}^{10}\)啊。
然而。。。
#include<cstdio> #include<algorithm> using namespace std; int n,m,a[20],tot; void dfs(int u) { if (u==n+1) {++tot;return;} for (int i=a[u-1];i<=m;++i) a[u]=i,dfs(u+1); } int main() { n=10;m=10;dfs(1); printf("%d\n",tot); return 0; }
这里打表打的就是\(10\)个\([0,10]\)整数单调不降的方案数。
运行结果:
184756
\(???\)
状态数只有这么点?
我目前还不知道为什么。
但是既然状态数这么少就直接\(hash\)一下然后\(map\)存啊。
把既然是\([0,10]\)的整数就把它压成一个\(11\)进制的数,显然并不会爆long long。
可以直接\(dp\)。判断一下当前状态是先手还是后手进行操作,如果是先手操作就是从所有后继状态的\(dp\)值中取\(\max\),否则就是取\(\min\)。
code
#include<cstdio> #include<algorithm> #include<map> using namespace std; #define ll long long int gi() { int x=0,w=1;char ch=getchar(); while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar(); if (ch=='-') w=0,ch=getchar(); while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); return w?x:-x; } const int N = 20; const int inf = 2e9; int n,m,A ,B ,a ; map<ll,int>M; ll hash() { ll res=0; for (int i=1;i<=n;++i) res=res*11+a[i]; return res; } void unpack(ll zt) { for (int i=n;i;--i) a[i]=zt%11,zt/=11; } int dfs(ll zt) { if (M.find(zt)!=M.end()) return M[zt]; unpack(zt);int t=0,res; for (int i=1;i<=n;++i) t^=a[i]&1; res=t?inf:-inf; for (int i=1;i<=n;++i) if (a[i-1]>a[i]) { ++a[i]; ll nxt=hash(); if (t) res=min(res,dfs(nxt)-B[i][a[i]]); else res=max(res,dfs(nxt)+A[i][a[i]]); --a[i]; } return M[zt]=res; } int main() { n=gi();m=gi();a[0]=m; for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) A[i][j]=gi(); for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) B[i][j]=gi(); for (int i=1;i<=n;++i) a[i]=m;M[hash()]=0; printf("%d\n",dfs(0));return 0; }
相关文章推荐
- BZOJ.5248.[九省联考2018]一双木棋chess(对抗搜索 记忆化)
- [BZOJ5248][九省联考2018]一双木棋(连通性DP,对抗搜索)
- [BZOJ5248] 2018九省联考 D1T1 一双木棋 | 博弈论 状压DP
- [BZOJ5249][多省联测2018]IIIDX
- [九省联考 2018]一双木棋chess
- [九省联考2018] 一双木棋 chess
- [BZOJ5251][多省联测2018]劈配
- 洛谷P4363 [九省联考2018]一双木棋chess 【状压dp】
- bzoj 5248: [2018多省省队联测]一双木棋
- 【BZOJ5248】【九省联考2018】一双木棋(搜索,哈希)
- [DP] bzoj1801: [Ahoi2009]chess 中国象棋&bzoj 4806: 炮
- Bzoj1801:[Ahoi2009]chess 中国象棋:dp
- bzoj 5286: [Hnoi2018]转盘
- BZOJ5324 & 洛谷4563 & LOJ2545:[JXOI2018]守卫——题解
- BZOJ1801: [Ahoi2009]chess 中国象棋
- bzoj5194 [Usaco2018 Feb]Snow Boots(离线+贪心+并查集)
- bzoj5191 [Usaco2018 Feb]Slingshot
- bzoj1801 AHOI2009 chess
- bzoj1801[AHOI2009]CHESS中国象棋
- [BZOJ5289][HNOI2018]排列(拓扑排序+pb_ds)