ZOJ 1102 Phylogenetic Trees Inherited (My algorithm , Time limit exeeded)
来源:互联网 发布:老师讲课软件 编辑:程序博客网 时间:2024/05/21 15:08
- #include<iostream>
- #include<string>
- using namespace std;
- int n, l;
- string s[1025];
- int cnt[1025][26];
- string result;
- inline bool input()
- {
- cin>>n>>l;
- if ( !n && !l ) return false;
- for (int i=1; i<=n; i++)
- cin>>s[i];
- return true;
- }
- inline void count(int i)
- {
- for (int k=0; k<26; k++)
- cnt[0][k] = 0;
-
- for (int j = 1; j <= n; j++)
- {
- for (int k=0; k<26; k++)
- cnt[j][k] = cnt[j-1][k];
- cnt[j][s[j][i] - 'A']++;
- }
- }
- int solve(int s, int t, int pIdx)
- {
- int diff = 0;
- int count[26];
- int max = cnt[t][pIdx] - cnt[s-1][pIdx], idx = pIdx;
- for (int j=0; j<26; j++)
- {
- count[j] = cnt[t][j] - cnt[s-1][j];
- if (max < count[j]){
- max = count[j];
- idx = j;
- }
- }
- if (idx != pIdx) diff++;
- if ( s==t ) return diff;
- int min = 90000;
- for (int i=0; i<26; i++)
- {
- if (count[i] != max) continue;
- int d = 0;
- d += solve( s, (s+t)/2, i);
- d += solve( (s+t+1)/2, t, i);
- if ( d < min ) min = d;
- }
- return diff + min;
- }
- int main()
- {
- while (input())
- {
- int diff = 0;
- result = "";
- for (int i=0; i<l; i++)
- {
- count(i);
- int max = -1, idx = -1;
- for (int j=0; j<26; j++)
- if (cnt[n][j] > max ){
- max = cnt[n][j];
- idx = j;
- }
- int min = 90000;
- for (int j = 0; j<26; j++)
- {
- if (cnt[n][j] != max) continue;
- int d = solve(1, n, idx);
- if (d < min){
- min = d;
- idx = j;
- }
- }
- result += (char)(idx + 'A');
- diff += min;
- }
- cout<<result<<" "<<diff<<endl;
- }
- }