1. 程式人生 > >2510 DFS打表

2510 DFS打表

剛開始做這道題,超時、超時、超時,而且剪枝優化各種無效,突然看到輸入範圍n<=24,用我的程式碼把24敲進去,雖然慢,但是能算出結果,嘿嘿,於是我把1——24所有結構都計算了出來,存放到陣列中,你輸入那個n我反饋給你那個結果,自己寫的dfs就相當於一個計算器,事先將結果算出。

再說一點題外話,下週cqw大佬出征青島icpc區域賽,作為集訓隊曾經的一員祝願他展現出最好的實力,取得佳績,nuc-acm加油!

以下給出程式碼:

dfs(計算器,用於計算結果)

#include <bits/stdc++.h>

using namespace std;

int Total[25];
int ans, n, sum;
char m[25];


void Total_init()
{
    Total[1] = 1;
    for (int i = 2; i < 25; i++) Total[i] = Total[i-1] + i;
}


void get_count()
{
    int nn = n;
    while (nn >= 1) {

        for (int i = 1; i <= nn; i++) {

            if (m[i] == '+') sum++;

            if (i < nn) {

                if (m[i] == m[i+1]) m[i] = '+';
                else m[i] = '-';

            }

        }

        nn--;
    }
}



void dfs(int index, int type)     //type值0代表+,1代表-
{
    if (type == 0) m[index] = '+';
    else m[index] = '-';

    if (index == n) {
        sum = 0;
        get_count();
        if (sum == Total[n]/2) ans++;
        return ;
    }

    dfs(index+1, 0);
    dfs(index+1, 1);
}

int main()
{

    Total_init();

    for (int i = 1; i <= 24; i++) {
        cout << i << ":" << Total[i] << endl;
    }

    while (cin >> n && n) {

        if (Total[n]%2 != 0) {
            cout << 0 << endl;
            continue;
        }

        ans = 0;

        dfs(1, 0);
        dfs(1, 1);

        cout << ans << endl;
    }
    return 0;
}

將計算的結果存入陣列

int res[25] = {0, 0, 0, 4, 6, 0, 0, 12, 40, 0, 0, 171, 410, 0, 0, 1896, 5160, 0, 0, 32757, 59984, 0, 0, 431095, 822229};

最後輸出結果

#include <bits/stdc++.h>

using namespace std;

int res[25] = {0, 0, 0, 4, 6, 0, 0, 12, 40, 0, 0, 171, 410, 0, 0, 1896, 5160, 0, 0, 32757, 59984, 0, 0, 431095, 822229};
int n;


int main()
{

    while (cin >> n && n) {
        cout << n << " " << res[n] << endl;
    }


    return 0;
}