低价回文

低价回文

审题
//注意空字符串也是回文。

image

#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;
}
//注意空字符串也是回文。
posted @ 2022-03-10 17:56  2T_WANG  阅读(54)  评论(0编辑  收藏  举报