求助方案输出
查看原帖
求助方案输出
414386
Isshiki·Iroha楼主2023/10/17 21:08

我写了一个 O(n4)\text{O}(n^4) 的算法,但是不会输出方案,求助思路。

#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;
}
2023/10/17 21:08
加载中...