zyf不当心得了一种怪病,为了维持一天的精力他必须不停跳动。因而他买了一条跳舞毯,天天跳上几小时。众所周知,跳舞毯是给定一个序列,让你在指定时间踏指定的按钮,但zyf彷佛不怎么擅长,为此他写了个外挂,以修改它的输入序列,获得满分!
这个外挂的厉害之处在于它能等到zyf跳完、输入序列后再进行修改,修改的方式有三种,在任意位置插入、删除或替换一个指令,每次插入须要a时间,删除须要b时间,替换须要c时间,如今zyf想用最短期去修改他输入的序列获得满分(即与给定序列同样),但这显然已经超过了当前外挂的能力范围,因而只好求助于你,给这外挂写个补丁。ios
算法说明:算法
又是一道典型的动态规划题目,假设机器给定的序列是S1,zyf输入的序列为S2。序列S1的长度为len1,序列S2的长度为len2,那么假设经过S2变换到序列S1须要的代价是res[len1][len2], 那么能够想到res[len1][len2]必定是min{ res[len1][len2-1]+a , res[len1+1][len2]+b , S1[len1-1]==S2[len2-1]?S1[len1-1][len2-1]:S1[len1-1][len2-1]+c },那么递归会重复计算,效率不高,所以使用动态规划。spa
代码以下:code
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 6 int res[1010][1010] ; 7 int len1 , len2 ; 8 9 10 int main() 11 { 12 int a , b , c ; 13 while(cin >> a >> b >> c){ 14 string s1 , s2 ; 15 cin >> s1 >> s2 ; 16 len1 = s1.length() ; 17 len2 = s2.length() ; 18 // memset(res,0,sizeof(res)); 19 int i , j ; 20 for(i = 0 ; i <= len1 ; i++){ 21 res[i][0] = i * a ; 22 } 23 for(i = 0 ; i <= len2 ; i++){ 24 res[0][i] = i * b ; 25 } 26 for(i = 1 ; i <= len1 ; i++){ 27 for(j = 1 ; j <= len2 ; j++){ 28 int p1 = res[i][j-1] + b ; 29 int p2 = res[i-1][j] + a ; 30 int p3 ; 31 if(s1[i-1] == s2[j-1]){ 32 p3 = res[i-1][j-1] ; 33 }else{ 34 p3 = res[i-1][j-1] + c ; 35 } 36 int min = p1 < p2 ? p1 : p2 ; 37 res[i][j] = min < p3 ? min : p3 ; 38 } 39 } 40 cout << res[len1][len2] << endl; 41 } 42 return 0 ; 43 }