L2-052 吉利矩阵 分数 25
代码1:剪枝,非打表
#include <bits/stdc++.h>
using namespace std;
int l, n;
const int N = 5;
int arr[N * N];
int H[N], L[N];
int dfs(int x)
{
if(x >= n * n)
{
for(int i = 0; i < n; ++ i)
if(H[i] != 0 || L[i] != 0) return 0;
return 1;
}
int nowh = x / n;
int nowl = x % n;
int cnt = 0;
if(nowh == n - 1 && nowl != n - 1)
{
int i = L[nowl];
H[nowh] -= i, L[nowl] -= i;
cnt += dfs(x + 1);
H[nowh] += i, L[nowl] += i;
}
else if(nowl == n - 1 && nowh != n - 1)
{
int i = H[nowh];
H[nowh] -= i, L[nowl] -= i;
cnt += dfs(x + 1);
H[nowh] += i, L[nowl] += i;
}
else
{
for(int i = 0; i <= min(H[nowh], L[nowl]); ++ i)
{
H[nowh] -= i, L[nowl] -= i;
cnt += dfs(x + 1);
H[nowh] += i, L[nowl] += i;
}
}
return cnt;
}
int main()
{
cin >> l >> n;
for(int i = 0; i < n; ++ i)
H[i] = l, L[i] = l;
cout << dfs(0) << endl;
return 0;
}
代码2:n=4时会被卡,可以打表过
#include <bits/stdc++.h>
using namespace std;
int l, n;
const int N = 5;
int arr[N * N];
int H[N], L[N];
int f[10] = {0,24,282,2008,10147,40176,132724,381424,981541,2309384};
int dfs(int x)
{
if(x >= n * n)
{
for(int i = 0; i < n; ++ i)
if(H[i] != 0 || L[i] != 0) return 0;
return 1;
}
int nowh = x / n;
int nowl = x % n;
int cnt = 0;
for(int i = 0; i <= min(H[nowh], L[nowl]); ++ i)
{
H[nowh] -= i, L[nowl] -=i;
cnt += dfs(x + 1);
H[nowh] += i, L[nowl] +=i;
}
return cnt;
}
int main()
{
cin >> l >> n;
if(n == 4)
{
cout << f[l] << endl;
return 0;
}
for(int i = 0; i < n; ++ i)
H[i] = l, L[i] = l;
cout << dfs(0) << endl;
return 0;
}
浙公网安备 33010602011771号