便宜的迴文 (USACO 2007)(c++)

2019-08-21便宜的迴文(USACO 2007)

 

內存限制:128 MiB  時間限制:1000 ms  標準輸入輸出

 

題目類型:傳統  評測方式:文本比較

題目描述

追蹤每頭奶牛的去向是一件棘手的任務,爲此農夫約翰安裝了一套自動系統。他在每頭牛身上安裝了一個電子身份標籤,當奶牛經過掃描器的時候,系統能夠讀取奶牛的身份信息。目前,每一個身份都是由一個字符串組成的,長度爲M (1≤M≤2000),全部的字符都取自小寫的羅馬字母。ios

奶牛們都是頑皮的動物,有時她們會在經過掃描器的時候倒着走,這樣一個原來身份爲abcb的奶牛就可能有兩個不一樣的身份了(abcb和bcba),而若是身份是abcba的話就不會有這個問題了。ui

約翰想改變奶牛們的身份,使他們無論怎麼走讀起來都同樣。好比說,abcb能夠在最後加個a,變成迴文abcba;也能夠在前面加上bcb,變成迴文bcbabcb;或者去除字母a,保留的bcb也是一條迴文。總之,約翰能夠在任意位置刪除或插入一些字符使原字符串變成迴文。spa

不巧的是,身份標籤是電子作的,每增長或刪除一個字母都要付出相應的費用(0≤代價≤10000)。給定一頭奶牛的身份標籤和增長或刪除相關字母的費用,找出把原來字符串變成迴文的最小費用。注意空字符串也是迴文。code

輸入格式

第一行:兩個用空格分開的整數:N和M 第二行:一個長度剛好爲M的字符串,表明初始的身份標籤 第三行到第N+2行:每行爲一個用空格分開的三元組:其中包括一個字符和兩個整數,分別表示增長或刪除這個字符的費用blog

輸出格式

第一行:只有一個整數,表示改造這個身份標籤的最小費用內存

樣例

樣例輸入

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

樣例輸出

900

代碼以下

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <cstring>
 6 #include <cstdlib>
 7 using namespace std;
 8 int cn,n,ab[30],f[2010][2010];
 9 char a[2010];
10 
11 int main () {
12     scanf ("%d%d",&cn,&n);
13     scanf ("%s",a+1);
14     for (int i=1;i<=cn;i++) {
15         char ca;
16         scanf (" %c",&ca);
17         int x,y;
18         scanf ("%d%d",&x,&y);
19         ab[ca-'a']=min(x,y);
20     }    
21     for (int i=2;i<=n;i++) {
22         for (int j=i-1;j>0;j--) {
23             if (a[i]==a[j]) {
24                 f[j][i]=f[j+1][i-1];
25             }
26             else {
27                 f[j][i]=min(f[j+1][i]+ab[a[j]-'a'],f[j][i-1]+ab[a[i]-'a']);
28             }
29         }
30     }
31     cout << f[1][n];
32     return 0;
33 }

分析字符串

  讀入don't have too mach to say.      注意%c籤的' '(空格);
string

  定義:a[] 爲牌號 it

     ab[] 爲牌號的最小价值 (由於無論是添加或刪去,都應選價格最小的) io

     f[ j ][ i ] 爲a[ j ] 到 a[ i ] 的最小价值

  動態轉移方程 :f[ j ][ i ]= f[ j+1 ][ i-1 ] (if (a[ i ] == a [ j ]) ) 

             min(f[ j+1][ i ]+ad[ a[ j ]-'a'],f[ j ][ i-1 ]+ad[ a[i]-'a' ]) (if (a[ i ] != a[ j ])

  初始化 : f [ i ] [ i ]=0 第i個共一個字符,必定是迴文詞,花費0

  設

a b c b c
1 2 3 4 5

   若 j=2 && i=4 時  : 

       a [ i ]==a [ j ]  因此費用不用變更 f [j ][ i ]=f [j+1] [i -1] =f [3] [3]=0;

   若 j=1 && i=5 :

      a[ i ]!=a[ j ]  方案1:在f [ 2 ] [ 4 ] 的基礎上 增刪 a [ j ] 使其爲 bcb 或 abcba

            方案2:在f [ 2 ] [ 4 ] 的基礎上 增刪 a [ i ] 使其爲 bcb 或 cbcbc

           因此 f [ j ] [ i ]=min( f [ j+1 ] [ i ]+ab[ a[ j ]-'a'],f [ j ] [ i-1 ]+ab[ a[ i ]-'a']);

  綜上所述 :f [ 1 ] [ n ] 爲解

相關文章
相關標籤/搜索