Cheapest Palindrome G

題目鏈接:Cheapest Palindrome G


直接令 dp[i][j] 爲區間 [ i , j ] 的最小代價。

每次如果s[i] = s[j] 就可以直接從 dp[i+1][j-1] 當中轉移。

否則從 dp[i+1][j] 或者 dp[i][j-1] 轉移。


AC代碼:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2010,inf=0x3f3f3f3f;
int dp[N][N],n,m,add[N],del[N];	char str[N],ch[2];
int solve(int l,int r){
	if(l>=r)	return 0;
	if(dp[l][r]!=inf)	return dp[l][r];
	if(str[l]==str[r])	dp[l][r]=solve(l+1,r-1);
	dp[l][r]=min(dp[l][r],solve(l+1,r)+min(add[str[l]],del[str[l]]));
	dp[l][r]=min(dp[l][r],solve(l,r-1)+min(add[str[r]],del[str[r]]));
	return dp[l][r];
}
signed main(){
	cin>>n>>m;	scanf("%s",str+1);	memset(dp,0x3f,sizeof dp);
	for(int i=1,x,y;i<=n;i++){
		scanf("%s %d %d",ch,&x,&y);	add[ch[0]]=x,del[ch[0]]=y;
	}
	cout<<solve(1,m);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章