日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

newcoder 筱玛的迷阵探险(搜索 + 01字典树)题解

發(fā)布時(shí)間:2023/12/8 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 newcoder 筱玛的迷阵探险(搜索 + 01字典树)题解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述

筱瑪是個(gè)快樂(lè)的男孩子。
寒假終于到了,筱瑪決定請(qǐng)他的朋友們一起來(lái)玩迷陣探險(xiǎn)。
迷陣可以看做一個(gè)n×nn×n的矩陣A,每個(gè)格子上有一個(gè)有一個(gè)數(shù)Ai,j
入口在左上角的(1,1)處,出口在右下角的(n,n)處。每一步都只能向下或向右移動(dòng)一格。最后能獲得的經(jīng)驗(yàn)值為初始經(jīng)驗(yàn)e與路徑上經(jīng)過(guò)的所有數(shù)的權(quán)值異或和。
求筱瑪最大可能獲得的經(jīng)驗(yàn)值。

輸入描述:

第一行兩個(gè)整數(shù)n和e。
接下來(lái)n行,每行n個(gè)整數(shù),描述矩陣A。

輸出描述:

一個(gè)整數(shù),表示筱瑪最大可能獲得的經(jīng)驗(yàn)值。 示例1

輸入

復(fù)制 5 2 3 4 7 2 6 3 5 2 9 0 3 8 5 7 3 2 5 3 1 4 9 8 6 3 5

輸出

復(fù)制 15

鏈接:https://ac.nowcoder.com/acm/contest/545/D

思路:顯然我們直接搜等于是在搜一顆二叉樹,復(fù)雜度O(2^40)左右,肯定超時(shí)。但是我們可以用其他方法搜,先從左上角搜,,搜到對(duì)角線,然后把所有答案保存在01字典樹里。再?gòu)挠蚁陆峭厮?#xff0c;遇到對(duì)角線直接在字典樹搜最大異或,取最大值。

代碼:

#include<cmath> #include<cstdio> #include<vector> #include<cstring> #include <iostream> #include<algorithm> using namespace std; typedef long long ll; const int maxn = 20 + 10; const int INF = 0x3f3f3f3f; struct node{node* Next[2];node(){for(int i = 0; i < 2; i++)Next[i] = NULL;} }; node* e[maxn]; //走到對(duì)角線(含) int mp[maxn][maxn]; int n, s; void add(int x, int pos){node* a = e[pos];for(int i = 31; i >=0; i--){int v = (x >> i) & 1;if(a ->Next[v] == NULL)a ->Next[v] = new node();a = a ->Next[v];} } int query(int x, int pos){node* a = e[pos];int ret = 0;for(int i = 31; i >= 0; i--){int v = (x >> i) & 1;if(a ->Next[!v] != NULL){a = a ->Next[!v];ret += (1 << i);}else a = a ->Next[v];}return ret; } void dfs(int x, int y, int sum){if(x + y == n + 1){add(sum ^ mp[x][y], x);return;}dfs(x + 1, y, sum ^ mp[x][y]);dfs(x, y + 1, sum ^ mp[x][y]); } int Max; void dfsBack(int x, int y, int sum){if(x + y == n + 1){Max = max(query(sum, x), Max);return;}dfsBack(x - 1, y, sum ^ mp[x][y]);dfsBack(x, y - 1, sum ^ mp[x][y]); } int main(){scanf("%d%d", &n, &s);for(int i = 1; i <= n; i++){e[i] = new node();for(int j = 1; j <= n; j++){scanf("%d", &mp[i][j]);}}dfs(1, 1, s);Max = -1;dfsBack(n, n, 0);printf("%d\n", Max);return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/KirinSB/p/10627859.html

總結(jié)

以上是生活随笔為你收集整理的newcoder 筱玛的迷阵探险(搜索 + 01字典树)题解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。