POJ 3280 Cheapest Palindrome(DP 回文变形)
生活随笔
收集整理的這篇文章主要介紹了
POJ 3280 Cheapest Palindrome(DP 回文变形)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://poj.org/problem?id=3280
題目大意:給定一個字符串,可以刪除增加,每個操作都有代價,求出將字符串轉換成回文串的最小代價
Sample Input
3 4 abcb a 1000 1100 b 350 700 c 200 800Sample Output
900分析:這是一道最長回文串的變形,就是LCS
一串字符要變成回文,對于一個字符來說,刪掉它,或者增加對稱的一個該字符,都能達到回文的效果,所以是等價的。所以取代價的的時候選擇最小的就可以。
至于動態規劃方程:令dp[i][j]表示從第 i 個字符到第j個字符變成回文的最小代價,初始為0。接著LCS
dp[i][j] = min(dp[i+1][j]+cost[s[i]-'a'] , dp[i][j-1]+cost[s[j]-'a']) ;if(s[i]==s[j]) dp[i][j] = min(dp[i+1][j-1],dp[i][j]);
代碼如下:
1 # include<stdio.h> 2 # include<string.h> 3 # define maxn 2005 4 char s[maxn]; 5 int dp[maxn][maxn],cost[maxn]; 6 7 int min(int a,int b){ 8 return a<b ? a :b; 9 } 10 11 int main(){ 12 int n,m,a,b,i,j; 13 char temp; 14 while(scanf("%d%d",&n,&m)!=EOF){ 15 memset(dp,0,sizeof(dp)); 16 getchar(); 17 scanf("%s",s+1); 18 getchar(); 19 for(i=1;i<=n;i++){ 20 scanf("%c %d%d",&temp,&a,&b); 21 getchar(); 22 cost[temp-'a'] = min(a,b); 23 } 24 for(j=1;j<=m;j++){ 25 for(i=j+1;i>=1;i--){ 26 dp[i][j] = min(dp[i+1][j]+cost[s[i]-'a'] , dp[i][j-1]+cost[s[j]-'a']) ; 27 if(s[i]==s[j]) 28 dp[i][j] = min(dp[i+1][j-1],dp[i][j]); 29 } 30 } 31 printf("%d\n",dp[1][m]); 32 } 33 return 0; 34 }?
?
轉載于:https://www.cnblogs.com/acm-bingzi/p/3280090.html
總結
以上是生活随笔為你收集整理的POJ 3280 Cheapest Palindrome(DP 回文变形)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中考分流毁掉孩子?这位家长的血泪教训,揭
- 下一篇: 《转》cout和printf的混用而产生