題目鏈接:http://poj.org/problem?id=3280ios
題意就是給你一個字符串,含有n個字母,每一個字母能夠添加能夠去除,添加和刪除字母有花費,問組成一個迴文串。ide
思路就是每一個迴文串的最大子串一定有一個開頭一個結尾位置,最終位置爲0~len-1,這樣可是每一對起始位置都會有一個迴文長度,對每個長度進行搜就能夠了。oop
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <algorithm> 5 #include <stdlib.h> 6 #include <vector> 7 #include <set> 8 #include <queue> 9 #include <stack> 10 #define loop(s,i,n) for(i = s;i < n;i++) 11 #define cl(a,b) memset(a,b,sizeof(a)) 12 using namespace std; 13 using namespace std; 14 const int maxn = 2005; 15 16 int dp[maxn][maxn]; 17 int add[30], del[30]; 18 19 int main(){ 20 int n, m, i, j, len; 21 char c, str[maxn]; 22 cin >> n >> m >> str; 23 loop(0,i,n) 24 { 25 cin >> c; 26 cin >> add[c-'a'] >> del[c-'a']; 27 } 28 loop(1,len,m) 29 for(i = 0; i + len < m; i ++){ 30 j = i + len; 31 if(str[i] == str[j]){ 32 dp[i][j] = dp[i+1][j-1]; 33 }else{ 34 dp[i][j] = min( 35 min(dp[i+1][j]+add[str[i]-'a'], dp[i][j-1]+add[str[j]-'a']), 36 min(dp[i+1][j]+del[str[i]-'a'], dp[i][j-1]+del[str[j]-'a'])); 37 } 38 } 39 cout<<dp[0][m-1]<<endl; 40 return 0; 41 }