牛客練習賽 37 C 筱瑪的迷陣探險 【折半搜尋+01字典樹】
題目連結:https://ac.nowcoder.com/acm/contest/342/C
題目:
筱瑪是個快樂的男孩子。
寒假終於到了,筱瑪決定請他的朋友們一起來玩迷陣探險。
迷陣可以看做一個n×n的矩陣A,每個格子上有一個數Ai,j。
入口在左上角的(1,1)處,出口在右下角的(n,n)處。每一步都只能向下或向右移動一格。最後能獲得的經驗值為初始經驗e與路徑上經過的所有數的權值異或和。
求筱瑪最大可能獲得的經驗值。
輸入:
第一行兩個整數n和e。
接下來n行,每行n個整數,描述矩陣A。
輸出:
一個整數,表示筱瑪最大可能獲得的經驗值。
思路:直接搜尋全部會超時,用折半搜尋,對角線(坐下到右上)上的所有點當字典樹樹根,存從起點到對角線上的點的異或和的二進位制,然後從終點搜到對角線上的所的點,找到最大值;
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<math.h>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<stack>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const double pi=acos(-1.0);
const ll mod=1e8;
const int N=2;
const int M=22;
typedef struct Node
{
Node *Next[N];
}Node;
Node *tre[M];
int mp[M][M];
int n,e,ans;
Node * build()//建立根節點
{
Node *node=(Node *)malloc(sizeof(Node));
node->Next[0]=node->Next[1]=0;
return node;
}
void tree_insert(Node *root,int x)//插入二進位制
{
int t,i=30;
Node *p=root;
while(i>=0)
{
t=(x>>i)&1;
if(p->Next[t]==NULL)
p->Next[t]=build();
p=p->Next[t];
i--;
}
}
int tree_query(Node *root,int x)//尋找異或和最大的
{
int res=0,t,i=30;
Node *p=root;
while(i>=0)
{
t=(x>>i)&1;
if(p->Next[t^1]!=NULL)
{
res|=(1<<i);
t^=1;
}
p=p->Next[t];
i--;
}
return res;
}
void dfs1(int x,int y,int sum)//深搜從(0,0)到對角線(左下角到右上角)上的所有點
{
if(x+y==n-1)
{
sum^=mp[x][y];
tree_insert(tre[x],sum);
return;
}
dfs1(x+1,y,sum^mp[x][y]);
dfs1(x,y+1,sum^mp[x][y]);
}
void dfs2(int x,int y,int sum)//深搜從終點到對角線上的所有點
{
if(x+y==n-1)
{
ans=max(tree_query(tre[x],sum),ans);
return;
}
dfs2(x-1,y,sum^mp[x][y]);
dfs2(x,y-1,sum^mp[x][y]);
}
int main()
{
while(~scanf("%d %d",&n,&e))
{
for(int i=0;i<n;i++)
tre[i]=build();
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&mp[i][j]);
ans=0;
dfs1(0,0,e);
dfs2(n-1,n-1,0);
printf("%d\n",ans);
}
return 0;
}
相關文章
- 牛客練習賽
- 牛客練習賽60
- 牛客練習賽 26
- 牛客練習賽 71 AC
- 折半搜尋學習筆記筆記
- 牛客練習賽129 A-數數
- 牛客練習賽26 A 平面【遞推】
- 牛客練習賽27【C 水圖 dfs求最長路】
- 牛客練習賽26 C 城市規劃【思維+貪心】
- 笨辦法學C 練習46:三叉搜尋樹
- 牛客周賽 Round 36 (小白練習記)
- 牛客練習賽73 D題:離別
- 【牛客訓練記錄】牛客周賽 Round 69
- 【牛客訓練記錄】牛客周賽 Round 70
- 牛客小白月賽95 (賽前的練習之我是小菜雞)
- 牛客練習賽14B 區間的連續段
- Mysql 練習(牛客網)MySql
- 牛客練習賽40 B 小A與任務(貪心)
- 二分搜尋(折半查詢)
- 20240331_搜尋練習
- 牛客小白月賽99 C~E
- 牛客練習賽74 E CCA的期望(算概率的技巧+floyd處理)
- 牛客SQL練習第21題SQL
- 牛客小白月賽103 A--B--C
- 迷霧探險10 | 踩坑Gym
- golang學習筆記——迷宮的廣度優先搜尋Golang筆記
- hdu 1728 逃離迷宮 搜尋
- 洛谷P4799—— [CEOI2015 Day2]世界冰球錦標賽(折半搜尋)
- Python演算法練習--把搜尋樹轉成雙向連結串列Python演算法
- 牛客周賽48
- 牛客小白月賽15 C 表單 ( map 使用)
- Trie|如何用字典樹實現搜尋引擎的關鍵詞提示功能
- 【JavaScript】牛客程式設計練習:找出元素 item 在給定陣列 arr 中的位置JavaScript程式設計陣列
- 《迷霧偵探》國產賽博朋克偵探遊戲遊戲
- 字典樹學習
- 強化學習(十八) 基於模擬的搜尋與蒙特卡羅樹搜尋(MCTS)強化學習
- 牛客小白月賽105
- 牛客周賽 Round 63