2510 DFS打表
阿新 • • 發佈:2018-12-11
剛開始做這道題,超時、超時、超時,而且剪枝優化各種無效,突然看到輸入範圍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; }