題意:給定乙個n*n(n
<=20
n<=20
n<=2
0)大小的矩陣,矩陣中的每個點上有乙個數字,初始時,你自身有乙個數字,現在讓你從(1,1)走到(n,n),每次只能向下或向右走,將路徑上的數字以及你自身的數字異或起來,問最小的異或值為多少。
首先考慮資料最值,直接大力搜尋的話複雜度為c
4020
c_^c4
020
,複雜度很高。
所以我們可以將路徑拆為從(1,1)走20步到(x,y),再從(x,y)走20步道(n,n),這兩個分開計算複雜度為:2∗c
2010
2*c_^
2∗c201
0,路徑計算最大異或和的話,就需要用到字典樹,我們枚舉行號,建立字典樹,計算答案即可。
#include
using
namespace std;
typedef
long
long ll;
const
int maxn=
6e6+7;
#define int long long
int trie[maxn][2
];int tot=1;
void
insert
(int x)
}int
myfind
(int x)
return res;
}void
init()
int n;
int a[29]
[29];
intgetid
(int x,
int y)
vector<
int> v1[29]
,v2[29]
;bool
check
(int x,
int y)
int e;
void
dfs1
(int x,
int y,
int step,
int val)if(
check
(x,y+1)
)dfs1
(x,y+
1,step+
1,val^a[x]
[y+1])
;if(check
(x+1
,y))
dfs1
(x+1
,y,step+
1,val^a[x+1]
[y]);}
void
dfs2
(int x,
int y,
int step,
int val)if(
check
(x-1
,y))
dfs2
(x-1
,y,step+
1,val^a[x-1]
[y]);if
(check
(x,y-1)
)dfs2
(x,y-
1,step+
1,val^a[x]
[y-1])
;}signed
main()
dfs1(1
,1,1
,a[1][
1]);
dfs2
(n,n,
1,a[n]
[n])
;int maxx=0;
for(
int i=
1;i<=n;
++i)
printf
("%lld\n"
,maxx)
;return0;
}
牛客練習賽37 C題筱瑪的迷陣探險
牛客練習賽37 c題筱瑪的迷陣探險 ps 需要前置技能 dfs和字典樹 二分dfs 分別從 1,1 和 n,n 開始走n步,會發現無論如何走最後都會到達對角線上 找出對角線上對應的每個可能結果,開倆個陣列,分別存在倆個陣列中,在對應的點上的集合上,乙個插入到字典樹中,另乙個查詢和它異或最大的數。in...
牛客練習賽9
時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 珂朵莉想每天都給威廉送禮物,於是她準備了n個自己的本子 她想送最多的天數,使得每天至少送乙個本子,但是相鄰兩天送的本子個數不能相同 珂朵莉最多送幾天禮物呢 第一行乙個整...
牛客練習賽15
時間限制 c c 2秒,其他語言4秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 第一次期中考終於結束啦!沃老師是個語文老師,他在評學生的作文成績時,給每位學生的分數都是乙個小於10的非負小數。amy 8.99999999999999999999...