您的位置:首页 > 其它

HDU 1243 【基础DP 】

2015-09-12 22:17 197 查看
这道题怎么会没做过呢。。。我觉得我绝逼是见过这道题的了,,最长公共子序列的简单变形。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 100010
int a[550];
int dp[2][maxn];
int main()
{
	int n;
	while(cin>>n)
	{
		memset(dp,0,sizeof(dp));
		string s,x,y;
		cin>>s;
		for(int i=0;i<n;i++)
		{
			cin>>a[s[i]];
		}
		cin>>x>>y;
		int flag=0;
		for(int i=0;i<x.length();i++)
		{
			flag=i&1;
			for(int j=0;j<y.length();j++)
			{
				if(y[j]!=x[i])
					dp[flag][j+1]=max(dp[flag][j],dp[!flag][j+1]);
				else 
					dp[flag][j+1]=max(max(dp[flag][j],dp[!flag][j+1]),dp[!flag][j]+a[y[j]]);
			}
		}
		cout<<dp[flag][y.length()]<<endl;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: