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;
}
posted @ 2024-09-03 11:08  Frodnx  阅读(128)  评论(0)    收藏  举报