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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ 3280 Cheapest Palindrome(DP 回文变形)

發布時間:2025/3/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 3280 Cheapest Palindrome(DP 回文变形) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:http://poj.org/problem?id=3280

題目大意:給定一個字符串,可以刪除增加,每個操作都有代價,求出將字符串轉換成回文串的最小代價

Sample Input

3 4 abcb a 1000 1100 b 350 700 c 200 800

Sample 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 回文变形)的全部內容,希望文章能夠幫你解決所遇到的問題。

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