DP練習1題解E
阿新 • • 發佈:2018-12-09
DP練習1題解E
本題首A學長指出是最長字元子序列的問題
和最長字串子串很像 但是不相同
(比如bebbebeb 兩者區別是連續不連續)(
一開始以為是要連續還以為他說錯了T_T)
emmm 我沒想到 我想到是裸DP
dp[i][j]表示從i到j需要補充的字元數
每次狀態轉移從d[i-1][j-1](頭尾相同的話)
和d[i+1][j]+1 d[i][j-1]+1中選最小
對長度為1的預處理
然後長度為2到n開始DP
程式碼如下
#include<iostream> #include<cstring> char ch[5001]; int a[5001][5001]; using namespace std; int main() { int i,n,k,j; memset(a,0,sizeof(a)); cin>>n; getchar(); for (i=1;i<=n;i++) { cin>>ch[i]; a[i][i]=0; } getchar(); for (k=2;k<=n;k++) for (i=1;i<=n-k+1;i++) { j=i+k-1; if (ch[i]==ch[j]) a[i][j]=a[i+1][j-1]; else a[i][j]=a[i+1][j]+1; if (a[i][j-1]+1<a[i][j]) a[i][j]=a[i][j-1]+1; } cout<<a[1][n]<<endl; return 0; }
以上