poj 3280

1155 단어
제목: 문자열을 삽입하고 삭제하는 등 메모열로 만들지만, 문자마다 작업 소모가 다르다.최소 소모를 구하다.
분명히 하나의 dp문제로 상태 dp[i][j]를 설정할 수 있다. 이것은 i~j 단락에서 회문으로 전환하는 최소 소모를 나타낸다. 분명히 상태 이동은
4
if(s[i]==s[j])dp[i][j]=dp[i+1][j-1];
else
dp[i][j]=min(dp[i+1][j]+w[s[i]-'a'],dp[i][j-1]+w[s[j]-'a']);
삭제와 삽입은 다르지만 이 두 가지 조작은 등가이다. 이 두 가지 조작은 이 두 가지 조작의 최소치를 취하면 ok이다.
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int w[30],n,m,dp[2005][2005];
char s[2005],ch;
int main()
{
	int x,y;
	while(scanf("%d%d",&m,&n)!=EOF)
	{
		getchar();
		scanf("%s",s);
		getchar();
		for(int i=0;i<m;i++)
		{
			scanf("%ch",&ch);
			scanf("%d%d",&x,&y);
			getchar();
			w[ch-'a']=min(x,y);
		}
		for(int i=n-1;i>=0;i--)
			for(int j=i+1;j<n;j++)
			{
				if(s[i]==s[j])dp[i][j]=dp[i+1][j-1];
				else
					dp[i][j]=min(dp[i+1][j]+w[s[i]-'a'],dp[i][j-1]+w[s[j]-'a']);
			}
			printf("%d
",dp[0][n-1]); } return 0; }

좋은 웹페이지 즐겨찾기