[GDKOI2016]染色大战
min-max对抗搜索回家再写
#include <iostream> #include <cstdio> #include <algorithm> #include <queue> using namespace std; inline int read() { int r=0;char c=getchar();bool f=0; while(!isdigit(c)){if(c=='-')f=1;c=getchar();} while(isdigit(c))r=(r<<3)+(r<<1)+(c^48),c=getchar(); return f?-r:r; } int n, m; int bin[25]; int mp[22][22], f[2][1<<22], e[22][22], val[22][22]; int END; int dfs(int x, int sit) { if (sit == END) return 0; if (f[x][sit]) return f[x][sit]; int res = -1e9; for (int i = 1 ; i <= n ; i ++) { for (int j = 1 ; j <= m ; j ++) { if (mp[i][j]) continue; int sum = 0; mp[i][j] = 1; if (mp[i][j] and mp[i-1][j] and mp[i][j-1] and mp[i-1][j-1]) sum += val[i-1][j-1]; if (mp[i][j] and mp[i-1][j] and mp[i-1][j+1] and mp[i][j+1]) sum += val[i-1][j]; if (mp[i][j] and mp[i+1][j] and mp[i+1][j+1] and mp[i][j+1]) sum += val[i][j]; if (mp[i][j] and mp[i+1][j] and mp[i][j-1] and mp[i+1][j-1]) sum += val[i][j-1]; if (sum) sum += dfs(x, sit + e[i][j]); else sum -= dfs(x^1, sit + e[i][j]); res = max(res, sum); mp[i][j] = 0; } } f[x][sit] = res; return res; } int main() { bin[0] = 1; for (int i = 1 ; i <= 21 ; i ++) bin[i] = bin[i-1] << 1; n = read(), m = read(); for (int i = 1 ; i <= n ; i ++) { for (int j = 1 ; j <= m ; j ++) { mp[i][j] = read(); e[i][j] = (1 << ((i - 1) * m + j - 1)); if (mp[i][j] == 0) END += e[i][j]; } } for (int i = 1 ; i <= n - 1 ; i ++) { for (int j = 1 ; j <= m - 1 ; j ++) { val[i][j] = read(); } } printf("%d\n", dfs(1, 0)); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!