Warning: session_start(): open(/tmp/sess_1fc00e4450515d28701c404f67dd50e6, O_RDWR) failed: No space left on device (28) in /data/wiki/inc/init.php on line 239

Warning: session_start(): Failed to read session data: files (path: ) in /data/wiki/inc/init.php on line 239

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/auth.php on line 430
Writing /data/wiki/data/cache/d/de2edb2fcb553ea79b79c722a4e13dbc.captchaip failed

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/inc/actions.php on line 38

Warning: Cannot modify header information - headers already sent by (output started at /data/wiki/inc/init.php:239) in /data/wiki/lib/tpl/dokuwiki/main.php on line 12
2020-2021:teams:wangzai_milk:weekly:poj_3280 [CVBB ACM Team]

用户工具

站点工具


2020-2021:teams:wangzai_milk:weekly:poj_3280

POJ 3280

每个字母有给定的删除\增添代价,问使得字符串变为回文串的最小花费。

题解:这个题是这样,当看到区间dp的那一刻就会了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
int n,m,ad[26],de[26],f[2005][2005];
char s[2005];
int main()
{
	while(~scanf("%d%d",&n,&m))
	{
		scanf("%s",s);
		for(int i=1;i<=n;i++)
		{
			char c;
			scanf(" %c",&c);
			scanf("%d%d",&ad[c-'a'],&de[c-'a']);
		}
		for(int k=1;k<=m;k++)
		{
			for(int i=0;i<m;i++)
			{
				int j=i+k-1;
				if(k==1)f[i][j]=0;
				else
				{
					f[i][j]=min(f[i+1][j]+de[s[i]-'a'],f[i][j-1]+de[s[j]-'a']);
					f[i][j]=min(f[i][j],f[i+1][j]+ad[s[i]-'a']);
					f[i][j]=min(f[i][j],f[i][j-1]+ad[s[j]-'a']);
					if(s[i]==s[j])f[i][j]=min(f[i][j],f[i+1][j-1]);
				}
			}
		}
		printf("%d\n",f[0][m-1]);
	}
	return 0;
}
2020-2021/teams/wangzai_milk/weekly/poj_3280.1588996999.txt.gz · 最后更改: 2020/05/09 12:03 由 zars19