問題描述:
已知:有兩給定序列str1和str2,序列只由組成。現在序列中插入空格(用'-'表示),由於『-』可表示任意字元,故上述插入操作可使str1=str2,例如:
str1:agtgatg
str2:gttag
插入'-『後變為:
str1:agtgat-g
str2:-gt--tag
另外,str1和str2對應位置的一對字元有固定權值,如下圖所示。定義相似度為:所有字元對的權值之和
求:插入'-'可獲得的最大相似度
輸入:第1行為n;之後為n個case,每個case佔兩行,每行由乙個正整數(代表str長度)和乙個字串(代表str)組成
輸出:可獲得的最大相似度
sample input:
7 agtgatg
5 gttag
7 agctatt
9 agctttaaa
sample output:
思路:
首先,將可獲得最大相似度的已插入序列對從某處切開,易知若要使總體相似度最大,左右兩子部分的相似度也必須最大,即具有最優子結構
記e(i, j)為以子串行str1(1, i)和str2(1, j)為輸入所得的最大相似度,則有如下遞迴表示式
原問題最優解即為e(n1, n2)
**:
#include #include int score[5][5] = ,,,
,};
char str1[110], str2[110];
int seq1[110], seq2[110]; //將輸入的字串行轉換為對應於score陣列的下標索引,方便後面查詢權值
int case_n;
int n1, n2;
void dp()
} printf("%d\n", e[n1][n2]);
}int main()
} scanf("%d%s", &n2, str2);
for(int j = 0; j < n2; j++)
} dp();
} return 0;
}
POJ 1080 基因序列相似度計算 動態規劃
本題為典型的動態規劃,關鍵找出序列比對的3個不同情況,即子問題 設d i j 為取s1第i個字元,s2第j個字元時的最大分值 則決定p為最優的情況有三種 p陣列為分數矩陣 1 s1取第i個字母,s2取 d i 1 j p s1 i 1 2 s1取 s2取第j個字母 d i j 1 p s2 j 1 ...
POJ 1080(最長公共子串行)
一道最長公共子串行變形的題目。關於那個 沒想到很好的處理方式,直接打表了。最長公共子串行的狀態轉移方程 if a i b i dp i j dp i 1 j 1 1 else dp i j max dp i 1 j dp i j 1 這道題需要做一下變形 s1取字母,s2取字母 dp i 1 j 1...
poj 動態規劃 1141
dp練習的第三道題,依然花了我斷斷續續好幾個小時 有人說看到題目裡的 2.if s is a regular sequence,then s and s are both regular sequences.3.if a and b are regular sequences,then ab is ...