区间DP,10pts求调QAQ
查看原帖
区间DP,10pts求调QAQ
519384
Link_Cut_Y楼主2022/2/20 17:55
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 2010;
char s[N];

int n, m;

int f[N][N];

struct Str
{
	int add, remove;
}ch[28];

int main()
{
	cin >> n >> m;
	
	cin >> (s + 1);
	
	for (int i = 1; i <= n; i ++ )
	{
		char awsl;
		cin >> awsl;
		cin >> ch[awsl - 'a'].add >> ch[awsl - 'a'].remove;
	}
		
	memset(f, 0x3f, sizeof f);
	
	for (int i = 1; i <= m; i ++ )
		f[i][i] = 0;
		
	for (int l = 1; l <= m; l ++ )
		for (int len = 1; l + len - 1 <= m; len ++ )
		{
			int r = l + len - 1;
			if (s[l] == s[r])
				f[l][r] = min(f[l][r], f[l + 1][r - 1]);
			else
			{
				f[l][r] = min(f[l][r], f[l + 1][r] + ch[s[l] - 'a'].add);
				f[l][r] = min(f[l][r], f[l][r - 1] + ch[s[r] - 'a'].add);
				f[l][r] = min(f[l][r], f[l + 1][r] + ch[s[l] - 'a'].remove);
				f[l][r] = min(f[l][r], f[l][r - 1] + ch[s[r] - 'a'].remove);
			}
		}
		
	cout << f[1][m] << endl;
	
	return 0;
}
2022/2/20 17:55
加载中...