NYOJ 1023 還是回文

2021-08-22 02:36:20 字數 1459 閱讀 7349

時間限制:2000 ms  |  記憶體限制:65535 kb

難度:3

描述判斷回文串很簡單,把字串變成回文串也不難。現在我們增加點難度,給出一串字元(全部是小寫字母),新增或刪除乙個字元,都會產生一定的花費。那麼,將字串變成回文串的最小花費是多少呢?

輸入多組資料

第乙個有兩個數n,m,分別表示字元的種數和字串的長度

第二行給出一串字元,接下來n行,每行有乙個字元(a~z)和兩個整數,分別表示新增和刪除這個字元的花費

所有數都不超過2000

輸出最小花費

樣例輸入

3 4

abcb

a 1000 1100

b 350 700

c 200 800

樣例輸出

900
思路:借鑑大佬的,如果要想這個字串為回文字串,則無論是增加還是刪除,我們都可以讓這個字串變成回文字串,所以我們可以先對其進行處理,然後我們可以對區間終點開始進行列舉對於dp[i][j]有三種情況:

1、dp[i+1][j]表示區間i到區間j已經是回文串了的最小代價,那麼對於s[i]這個字母,我們有兩種操作,刪除與新增,對應有兩種代價,dp[i+1][j]+add[s[i]],dp[i+1][j]+del[s[i]],取這兩種代價的最小值;

2、dp[i][j-1]表示區間i到區間j-1已經是回文串了的最小代價,那麼對於s[j]這個字母,同樣有兩種操作,dp[i][j-1]+add[s[j]],dp[i][j-1]+del[s[j]],取最小值

3、若是s[i]==s[j],dp[i+1][j-1]表示區間i+1到區間j-1已經是回文串的最小代價,那麼對於這種情況,我們考慮dp[i][j]與dp[i+1][j-1]的大小........

然後dp[i][j]取上面這些情況的最小值.........

**:

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define chu(a,b) memset(a,b,sizeof(a))

const int maxn=2010;

const int inf=0x3f3f3f3f;

int dp[maxn][maxn];

int a[maxn];

char s[maxn];

int main()

for(j=2; j<=m; j++)//j表示區間終點

}// for(i=1;i<=m;i++)

//

// printf("\n");

// }

printf("%d\n",dp[1][m]);

}return 0;

}

NYOJ1023 還是回文(區間dp)

分析 這道題是乙個簡單區間的dp,狀態定義為dp i j i 到 j 這個區間形成回文的最小花費,分兩種情況討論 s i s j dp i j dp i 1 j 1 s i s j dp i j min dp i j 1 cost s j a dp i 1 j cost s i a cost tt ...

nyoj 1023 還是回文 動態規劃

時間限制 2000 ms 記憶體限制 65535 kb 難度 3 描述 判斷回文串很簡單,把字串變成回文串也不難。現在我們增加點難度,給出一串字元 全部是小寫字母 新增或刪除乙個字元,都會產生一定的花費。那麼,將字串變成回文串的最小花費是多少呢?輸入 多組資料 第乙個有兩個數n,m,分別表示字元的種...

NYOJ 1023 還是回文 區間dp

時間限制 2000 ms 記憶體限制 65535 kb 難度 3描述 判斷回文串很簡單,把字串變成回文串也不難。現在我們增加點難度,給出一串字元 全部是小寫字母 新增或刪除乙個字元,都會產生一定的花費。那麼,將字串變成回文串的最小花費是多少呢?輸入多組資料 第乙個有兩個數n,m,分別表示字元的種數和...