低价回文
审题
//注意空字符串也是回文。
#include<bits/stdc++.h>
using namespace std;
int n,m;
char name[2005],namere[2005],aa;
int dp[2005][2005];
struct E{
char a;
int add,red;
}w[27];
int main (){
cin>>n>>m;
cin>>(name+1);
//for(int i=1;i<=m;i++){
// cin>>name[i];
// namere[m-i+1]=name[i];//本来还以为和线性dp的回文差不多
//}
for(int i=1;i<=n;i++){
cin>>aa;//字母的输入有什么规律吗?(doge re:并没有
//所以要存的有规律些 ke a:97(ascll
int tt=aa-96;
//w[tt].a=aa;
cin>>w[tt].add>>w[tt].red;
}
for(int i=1;i<2005;i++){
for(int j=i;j<2005;j++){
dp[i][j]=0x3f3f3f3f;
}
dp[i][i]=0;
}
for(int len=1;len<=m;len++){
for(int x=1;x<=m-len;x++){
int y=x+len;
if(name[x]==name[y]){//首尾一样-回文 和之前最优更改就一样了
cout<<"@@@"<<x<<" "<<y<<" "<<dp[x][y]<<" "<<dp[x+1][y-1]<<endl;
dp[x][y]=min(dp[x][y],dp[x+1][y-1]);
cout<<"???"<<dp[x][y]<<endl;
}
else{//main//如果首尾不一样 1.尾+首 2.首- 3.首+尾 4.尾- 再加上之前最优更改的基础
cout<<"!!!"<<x<<" "<<y<<" "<<dp[x+1][y]<<" "<<dp[x][y-1]<<" "<<" "<<w[name[x]-96].add<<" "<<w[name[x]-96].red<<" "<<w[name[y]-96].add<<" "<<w[name[y]-96].red<<endl;
dp[x][y]=min(dp[x][y],min(dp[x+1][y]+w[name[x]-96].add,dp[x+1][y]+w[name[x]-96].red));//1.2.
dp[x][y]=min(dp[x][y],min(dp[x][y-1]+w[name[y]-96].add,dp[x][y-1]+w[name[y]-96].red));//3.4.
cout<<"???"<<dp[x][y]<<endl;
}
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
cout<<dp[i][j]<<" ";
}
cout<<endl;
}
cout<<dp[1][m];
return 0;
}
//注意空字符串也是回文。