我写了一个 O(n4) 的算法,但是不会输出方案,求助思路。
#include<bits/stdc++.h>
using namespace std;
using lll = __int128;
using ll = long long;
const int maxn=505;
int T,n;
int s[maxn],a[maxn];
struct Dp{
int v,l1,r1,l2,r2,l3,r3;
}dp[maxn][maxn],g[maxn][maxn][513];
int main() {
read(T);
for(int t(1);t<=T;++t){
read(n);
for(int i(1);i<=n;++i){
read(a[i]);
s[i]=s[i-1]^a[i];
}
for(int i(1);i<=n;++i)dp[i][i].v=t,g[i][i][a[i]].v=t;
for(int i(1);i<n;++i)g[i][i+1][a[i+1]].v=t;
for(int L(3);L<=n;++L){
for(int l(1);l<=n-L+1;++l){
int r=l+L-1;
for(int i(l+1);i<r;++i){
if(dp[l][r].v==t)break;
for(int j(r-1);j>=i;--j){
if(dp[l][r].v==t)break;
if(dp[l][i-1].v==t&&dp[j+1][r].v==t&&g[i][j][s[i-1]^s[l-1]^s[r]^s[j]].v==t){
dp[l][r]={t,l,i-1,j+1,r,i,j};
}
}
}
for(int k(0);k<=512;++k){
if(g[l][r-1][k].v==t){
g[l][r][k]={t,l,r-1,-1,-1,-1,-1};
}
else if(g[l+1][r][k].v==t){
g[l][r][k]={t,l+1,r,-1,-1,-1,-1};
}
else if(dp[l][r].v=t&&(s[r]^s[l-1])==k){
g[l][r][k]={t,-1,-1,-1,-1,l,r};
}
}
}
}
if(dp[1][n].v==t){
puts("Huoyu");
}
else {
puts("Shuiniao");
}
}
return 0;
}