[九省联考2018]一双木棋chess——搜索+哈希
题目:bzoj5248 https://www.lydsy.com/JudgeOnline/problem.php?id=5248
洛谷P4363 https://www.luogu.org/problemnew/show/P4363
终于A了(虽然得开O2才能过)!
其实就是暴搜,用一个 n+1 进制数表示状态,进行最优策略转移即可;
注意 cnt[] 如果开成全局变量就不能每次翻译那个 n+1 进制数,否则会影响其它层的搜索;
(还有一种神奇的状态压缩是有几个用了 k 个1的列,就在第 k 个0后面加几个1……)
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<map> using namespace std; typedef long long ll; map<ll,ll>mp; map<ll,bool>vis; int n,m,s[3][15][15],inf=1e9,cnt[15]; ll pw(int a,int b) { ll ret=1; while(b){if(b&1)ret*=a;a*=a;b>>=1;} return ret; } ll dfs(ll x,bool f) { if(vis[x])return mp[x]; vis[x]=1;mp[x]=-inf;ll tx=x; // for(int i=m;i;i--)cnt[i]=tx%(n+1),tx/=(n+1); if(cnt[m]==n)return mp[x]=0; for(int i=1;i<=m;i++) { if(cnt[i]==n||(i>1&&cnt[i-1]<=cnt[i]))continue; cnt[i]++; ll y=x+pw(n+1,m-i); mp[x]=max(mp[x],s[f][cnt[i]][i]-dfs(y,!f)); cnt[i]--; } return mp[x]; } int main() { scanf("%d%d",&n,&m); for(int k=0;k<=1;k++) for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&s[k][i][j]); printf("%lld",dfs(0,0)); }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 本地部署 DeepSeek:小白也能轻松搞定!
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)