poj 3280(简单区间dp)

题意:将一个字符串转换成回文串的最小花费。


解题思路:简单的区间dp,dp[i][j]表示从i到j的字符串转换成回文串的最小化费。


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 20005;
int n,m,dp[maxn][maxn],insert[26],del[26];
char str[maxn],ch[2];

int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		scanf("%s",str+1);
		for(int i = 1; i <= n; i++)
		{
			scanf("%s",ch);
			scanf("%d%d",&insert[ch[0]-'a'],&del[ch[0]-'a']);
		}
		for(int i = 1; i <= m; i++) dp[i][i] = 0;
		for(int l = 2; l <= m; l++)
			for(int i = 1; i <= m; i++)
			{
				int j = i + l - 1;
				if(j > m) break;
				if(str[i] == str[j])
					dp[i][j] = dp[i+1][j-1];
				else
				{
					int tmp = min(dp[i+1][j] + insert[str[i]-'a'], dp[i+1][j] + del[str[i]-'a']);
					dp[i][j] = min(tmp,min(dp[i][j-1] + insert[str[j]-'a'], dp[i][j-1] + del[str[j]-'a']));
				}
			}
		printf("%d\n",dp[1][m]);
	}
	return 0;
}


你可能感兴趣的:(dp)