題目描述
追蹤每頭奶牛的去向是一件棘手的任務,為此農夫約翰安裝了一套自動系統。他在每頭牛身上安裝了乙個電子身份標籤,當奶牛通過掃瞄器的時候,系統可以讀取奶牛的身份資訊。目前,每個身份都是由乙個字串組成的,長度為m (1≤m≤2000),所有的字元都取自小寫的羅馬字母。
奶牛們都是頑皮的動物,有時她們會在通過掃瞄器的時候倒著走,這樣乙個原來身份為abcb的奶牛就可能有兩個不同的身份了(abcb和bcba),而如果身份是abcba的話就不會有這個問題了。
約翰想改變奶牛們的身份,使他們不管怎麼走讀起來都一樣。比如說,abcb可以在最後加個a,變成回文abcba;也可以在前面加上bcb,變成回文bcbabcb;或者去除字母a,保留的bcb也是一條回文。總之,約翰可以在任意位置刪除或插入一些字元使原字串變成回文。
不巧的是,身份標籤是電子做的,每增加或刪除乙個字母都要付出相應的費用(0≤代價≤10000)。給定一頭奶牛的身份標籤和增加或刪除相關字母的費用,找出把原來字串變成回文的最小費用。注意空字串也是回文。
輸入格式
第一行:兩個用空格分開的整數:n和m 第二行:乙個長度恰好為m的字串,代表初始的身份標籤 第三行到第n+2行:每行為乙個用空格分開的三元組:其中包括乙個字元和兩個整數,分別表示增加或刪除這個字元的費用
輸出格式
第一行:只有乙個整數,表示改造這個身份標籤的最小費用
樣例樣例輸入
3 4
abcb
a 1000 1100
b 350 700
c 200 800
樣例輸出900
我們看一下樣例, abcb, 其中 bcb 已經是回文, 我們需要更改 a
我們既可以把a刪去, 也可以在後面加乙個a
因此, 更改a的代價, 為加上他的代價與刪去他的代價中的最小值
當 ch[i] == ch[j] 時, 得方程
dp[i][j] = min(dp[i+1][j]+v[ch[i]], dp[i][j-1]+v[ch[j]]);
其中dp[i][j]
為把 i-j 變成回文的最小代價
#include#includeusing namespace std;
const int maxn = 1e4+10;
int dp[maxn][maxn], a[maxn], v[maxn];
char ch[maxn], now[2];
int main()
for(int j=2; j<=m; j++)
for(int i=j-1; i>=1; i--)
printf("%d\n", dp[1][m]);
return 0;
}
區間DP 低價回文
標籤 空格分隔 區間dp 回文詞 追蹤每頭奶牛的去向是一件棘手的任務,為此農夫約翰安裝了一套自動系統。他在每頭牛身上安裝了乙個電子身份標籤,當奶牛通過掃瞄器的時候,系統可以讀取奶牛的身份資訊。目前,每個身份都是由乙個字串組成的,長度為m 1 m 2000 所有的字元都取自小寫的羅馬字母。奶牛們都是頑...
最長回文子串(區間dp)
輸入乙個字串str,輸出str裡最長回文子串的長度。回文串 指aba abba cccbccc aaaa這種左右對稱的字串。串的子串 乙個串的子串指此 字元 串中連續的一部分字元構成的子 字元 串 例如 abc 這個串的子串 空串 a b c ab bc abc 輸入str str的長度 1000 ...
牛牛的回文串(區間dp)
第一行輸入乙個字串s 都是小寫字母 表示牛妹給牛牛的串 1 s 50 第二行輸入乙個整數m 0 m 50 接下來m行的格式是 add c x erase c x change c1 c2 x 三種中的一種 c c1 c2都是小寫字母 1 x 100000 所有允許的操作去除x部分後都是不同的輸出乙個...