比赛 4043级NOIP2022欢乐赛1st 评测结果 WWWWWWWWWWWWWWWWWWWW
题目名称 字符合并 最终得分 0
用户昵称 ZRQ 运行时间 0.521 s
代码语言 C++ 内存使用 3.60 MiB
提交时间 2022-10-28 22:06:16
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<map>
using namespace std;
const int N=310,M=2005;
int n,k;
int s[N][N][2],dp[N][N][2],q[N],ans;
map<string,int> w;
map<string,int> c;
int main()
{
	freopen("merge_2016.in","r",stdin);
	freopen("merge_2016.out","w",stdout);
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;++i) scanf("%d",&q[i]),s[i][i][q[i]]=1;
	for(int i=0;i<(1<<k);++i)
	{
		string state;
		for(int j=k-1;j>=0;--j)
			state.push_back(((i>>j)&1)+'0');
		cout<<state<<endl;
		scanf("%d%d",&c[state],&w[state]);
	}
	for(int l=1;l+k-1<=n;++l)//prework 
	{
		int r=l+k-1;
		string st;
		for(int i=l;i<=r;++i)
			if(s[i][i][0]) st.push_back('0');
			else st.push_back('1');
		s[l][r][c[st]]=1;
		dp[l][r][c[st]]=w[st];
	}
	for(int len=k+1;len<=n;++len)
	{
		for(int l=1;l+len-1<=n;++l)
		{
			int r=l+len-1;
			for(int x=l;x+len-k<=r;++x)
			{
				int y=x+len-k;
				if(!(s[x][y][0]||s[x][y][1])) continue;
				string ls="",rs="";
				for(int i=l;i<=x-1;++i) ls.push_back((char)q[i]+'0');
				for(int i=y+1;i<=r;++i) rs.push_back((char)q[i]+'0');
				if(s[x][y][0])
				{
					string str=ls+"0"+rs;
					int f=c[str];
					s[l][r][f]=1;
					dp[l][r][f]=max(dp[l][r][f],dp[x][y][0]+w[str]);
				}
				if(s[x][y][1])
				{
					string str=ls+"1"+rs;
					int f=c[str];
					s[l][r][f]=1;
					dp[l][r][f]=max(dp[l][r][f],dp[x][y][1]+w[str]);
				}
			}
			ans=max(ans,max(dp[l][r][0],dp[l][r][1]));
		}
	 } 
	 printf("%d\n",ans);
	return 0;
}