ZOJ 1102 Phylogenetic Trees Inherited (My algorithm , Time limit exeeded)

来源:互联网 发布:老师讲课软件 编辑:程序博客网 时间:2024/05/21 15:08
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. int n, l;
  5. string s[1025];
  6. int cnt[1025][26];
  7. string result;
  8. inline bool input()
  9. {
  10.     cin>>n>>l;
  11.     if ( !n && !l ) return false;
  12.     for (int i=1; i<=n; i++)
  13.         cin>>s[i];
  14.     return true;
  15. }
  16. inline void count(int i)
  17. {
  18.     for (int k=0; k<26; k++)
  19.         cnt[0][k] = 0;
  20.     
  21.     for (int j = 1; j <= n; j++)
  22.     {
  23.         for (int k=0; k<26; k++)
  24.             cnt[j][k] = cnt[j-1][k];
  25.         cnt[j][s[j][i] - 'A']++;
  26.     }
  27. }
  28. int solve(int s, int t, int pIdx)
  29. {   
  30.     int diff = 0;
  31.     int count[26];
  32.     int max = cnt[t][pIdx] - cnt[s-1][pIdx], idx = pIdx;
  33.     for (int j=0; j<26; j++)
  34.     {
  35.         count[j] = cnt[t][j] - cnt[s-1][j];
  36.         if (max < count[j]){
  37.             max = count[j];
  38.             idx = j;
  39.         }
  40.     }
  41.     if (idx != pIdx) diff++;
  42.     if ( s==t ) return diff;
  43.     int min = 90000;
  44.     for (int i=0; i<26; i++)
  45.     {
  46.         if (count[i] != max) continue;
  47.         int d = 0;
  48.         d += solve( s, (s+t)/2, i);
  49.         d += solve( (s+t+1)/2, t, i);
  50.         if ( d < min ) min = d;
  51.     }
  52.     return diff + min;
  53. }
  54. int main()
  55. {
  56.     while (input())
  57.     {
  58.         int diff = 0; 
  59.         result = "";
  60.         for (int i=0; i<l; i++)
  61.         {
  62.             count(i);
  63.             int max = -1, idx = -1;
  64.             for (int j=0; j<26; j++)
  65.                 if (cnt[n][j] > max ){
  66.                     max = cnt[n][j];
  67.                     idx = j;
  68.                 }
  69.             int min = 90000;
  70.             for (int j = 0; j<26; j++)
  71.             {
  72.                 if (cnt[n][j] != max) continue;
  73.                 int d = solve(1, n, idx);
  74.                 if (d < min){
  75.                     min = d;
  76.                     idx = j;
  77.                 }
  78.             }
  79.             result += (char)(idx + 'A');
  80.             diff += min;
  81.         }
  82.         cout<<result<<" "<<diff<<endl;
  83.     }
  84. }
原创粉丝点击