定义dp[s][k][p]为在s状态下 DarknessCatcher得k分,yxlxszx得q分的情况数。对于状态s:我们选择固定b数组,重新排列a数组来达到全部匹配的情况,其中s的二进制为1的位表示选择a[i]进行匹配。状态转移方程:当前选择a[j],若a[j]==b[i]:dp[s][p][k]+=dp[s^(1<<j)][p][k];若a[j]<b[i]:dp[s][p][k]+=dp[s^(1<<j)][p][k-1];若a[j]>b[i]:dp[s][p][k]+=dp[s^(1<<j)][p-1][k];最后统计不同比分组合的胜负情况
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
using ll = long long;
const ll N = 5e5 + 9;
typedef pair<ll, ll> pi;
vector<ll> ne[N];
bool st[N];
void solve()
{
ll n;
cin>>n;
vector<ll> a(n+10),b(n+10);
for(ll i=0;i<n;i++)
cin>>a[i];
for(ll i=1;i<=n;i++)
cin>>b[i];
vector<vector<vector<ll>>> dp(1<<n,vector<vector<ll>>(n+10,vector<ll>(n+10)));
dp[0][0][0]=1;
for(ll s=1;s<1<<n;s++)
{
ll i=0;
ll m=s;
while(m)
{
i+=m&1;
m>>=1;
}
for(ll j=0;j<n;j++)
{
if(!((s>>j)&1))
continue;
for(ll k=0;k<=n;k++)
{
for(ll p=0;p<=n;p++)
{
// if(k==p&&k==0)
// continue;
if(a[j]<b[i]&&p>0)
dp[s][k][p]+=dp[s^(1<<j)][k][p-1];
if(a[j]>b[i]&&k>0)
dp[s][k][p]+=dp[s^(1<<j)][k-1][p];
if(a[j]==b[i])
dp[s][k][p]+=dp[s^(1<<j)][k][p];
}
}
}
}
// cout<<dp[3][0][1]<<endl;
ll ans0=0,ans1=0,ans2=0;
for(ll i=0;i<=n;i++)
for(ll j=0;j<=n;j++)
{
if(i==j)
ans1+=dp[(1<<n)-1][i][j];
else if(i>j)
ans0+=dp[(1<<n)-1][i][j];
else
ans2+=dp[(1<<n)-1][i][j] ;
}
cout<<ans0<<" "<<ans2<<" "<<ans1<<endl;
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
ll t = 1;
// cin >> t;
while (t--)
{
solve();
}
}

京公网安备 11010502036488号