暴力.完全的暴力.把每种情况都考虑进去.没办法.
这道题我还练习了一下hash table的用法。感觉这次的code写的不好看不够直观。
最后还Time Limit Exceeded.....是我的Hash不够好么?


#include <iostream> using namespace std; const int MAXLED = 15; const int MAXLINE = 100; const int MAXHASHSIZE = 10000000; const int MAXSTATE = 1<<16; typedef int State[MAXLED]; int head[MAXHASHSIZE], next[MAXSTATE]; State data[MAXLINE]; // Use hash table void init_lookup_table(){ // memset(head, -1, sizeof(head)); // memset(next, -1, sizeof(next)); for (int i = 0; i < MAXHASHSIZE; i++) head[i] = -1; for (int i = 0; i < MAXSTATE; i++) next[i] = -1; } int hash(State& led, int pattern, int p) { int num = 0; for (int i = 1; i <= p; i++){ num *= 10; if (pattern & (1<<i)){ num += led[i-1]; } } return num % MAXHASHSIZE; } bool cmp_pattern(int s, int u, int pattern, int p) { for (int i = 1; i <= p; i++){ if (pattern & (1<<i)){ if (data[s] != data[u]) return false; } } return true; } bool try_to_insert(int s, int pattern, int p) { int h = hash(data[s], pattern, p); int u = head[h]; while (u != -1){ if (!cmp_pattern(s, u, pattern, p)) return false; u = next[u]; } next[s] = head[h]; head[h] = s; return true; } int main(int argc, char *argv[]){ // #ifndef ONLINE_JUDGE // freopen("11205.txt", "r", stdin); // #endif int times; for (int i = 0 ; i < MAXLINE; i++) for (int j = 0; j < MAXLED; j++) data[i][j] = 0; cin >> times; while (times--){ int p, n; // p: # of LEDs, n: # of symbols cin >> p >> n; // Input the dataset for (int i = 0; i < n; i++) for (int j = 0; j < p; j++) cin >> data[i][j]; int num = 15; for (int i = 2; i < (1<<p); i++){ int pattern = i, temp = i, ones = 0; init_lookup_table(); for (int j = 1; j <= p; j++){ if (pattern & (1<<j)) ones++; } if (ones >= num) continue; bool smaller = true; for (int j = 0; j < n && smaller; j++){ smaller = try_to_insert(j, pattern, p); if (!smaller) break; } if (smaller){ num = ones; } } cout << num << endl; } return 0; }