日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

21行代码AC——习题3-7 DNA序列(UVa-1368)_解题报告

發布時間:2024/2/28 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 21行代码AC——习题3-7 DNA序列(UVa-1368)_解题报告 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

勵志用盡量少的代碼做高效表達。


題目(提交)鏈接→UVa-1368


思路:

DNA序列:按列遍歷,記錄每一列出現次數最多(若同樣多,則字典序最小)的字母,錄入s串累加。
距離:重新遍歷,錄入出現次數比最多次數少(若相等,則字典序較大的)的次數,錄入sum累加

代碼:

#include<bits/stdc++.h> using namespace std; int main() {int n; cin >> n; while(n--) {int m, n; cin >> m >> n;char c[m][n]; for(int i = 0; i < m; i++) //輸入 for(int j = 0; j < n; j++) cin >> c[i][j];int mark; //mark+'0'記錄出現次數最多且最小的字符 int found = 0; //記錄出現次數最多的位數 int a[26];string s;int sum = 0;memset(a,0,sizeof(a));for(int i = 0; i < n; i++) { //i代表列for(int j = 0; j < m; j++) //j代表行 ,先遍歷行,將每行出現次數最多的字符找出,存入s串 a[(c[j][i]-'A')]++;for(int k = 0; k < 26; k++) //求最短漢明序列的字符。 if(a[k] > found) { //出現次數最多或 一樣多,但較小。 found = a[k]; mark = k;}for(int k = 0; k < 26; k++) //求次數 if((a[k] < found) || ((a[k] == found) && (mark < k))) sum+= a[k];s += (mark+'A'); //將符合要求的字符錄入s串 mark = 0; //置0環節 found = 0;memset(a,0,sizeof(a));}cout << s << endl << sum << endl;}return 0;}

二刷:

回過頭來又刷了一遍, 結合網上的討論成果, 有了些新的感悟。

改進:
1. 在一段代碼中同時求出了DNA序列與hamming距離。
2. 使用map容器對‘T’‘A’‘G’‘C’與其次數做映射,求解更方便。
3. 時間復雜度由O(52*m*n)降低到了O(4*m*n)。

理論上應該可以將時間復雜度降低到O(mn),做法是:在輸入DNA串的同時,用二維數組存儲每個字符出現的次數, 以Max數組按列比較 ,并記錄其最大值即可。
但需要同時維護一個二維數組和一個一維數組的空間規模, 并不劃算。


代碼展示

#include<bits/stdc++.h> using namespace std; int main() {int T; cin>>T; while(T--) {int m, n; cin>>m>>n;string input[m];for(int i = 0; i < m; i++) cin>>input[i]; //輸入map<char, int>um; //存儲m個字符串中相同位置出現的字符及其對應的次數int Hamming = 0; //存儲Hamming距離和for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) ++um[input[j][i]];char MAX = 'A';for(auto&j : um) //查找出現次數最多的字符if(j.second > um[MAX]) MAX=j.first;putchar(MAX); //輸出出現次數最多的字符Hamming += m-um[MAX];um.clear(); //清空map } cout << '\n' << Hamming << '\n'; } return 0; }

日拱一卒,功不唐捐。

總結

以上是生活随笔為你收集整理的21行代码AC——习题3-7 DNA序列(UVa-1368)_解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。