数据已假强?
查看原帖
数据已假强?
274271
_xinyu1113楼主2020/12/19 12:31

RT

状压+记忆化搜索,学校数据70,洛谷100

9 13以上的数据就能卡掉

建议再次加强

#include <bits/stdc++.h>
using namespace std;
long long a,b,x,ans;
vector<pair<long long,long long> >ik;
bool ik2[103][103];
long long jy[100][11][100];
int dfs(int y,int d,int l)
{
//	cout<<y<<" "<<d<<" "<<l<<endl;
	if(d==a&&y==b)
	{
//		cout<<"000000:"<<endl;
		ans++;
		return 1;
	}
	else if(jy[y][d][l])
	{
		ans+=jy[y][d][l];
		return jy[y][d][l];
	}
	if(d>=a||y>b)
	return 0;
	long long cnt=0;
	for(int i=0;i<ik.size();i++)
	{
		if(ik2[l][i])
		cnt+=dfs(y+ik[i].second,d+1,i);
	}
	jy[y][d][l]=cnt;
	return cnt;
}
int main()
{
//	freopen("1087.in","r",stdin);
//	freopen("1087.out","w",stdout);
	cin>>a>>b;
//	if(b>13&&a==9)
//	return 0; 
	for(int i=0;i<(1<<a);i++)
	{
		if(!((i&(i<<1))||(i&(i>>1))))
		{
			x=i;
			ik.push_back(make_pair(i,0));
			while(x)
			{
				ik[ik.size()-1].second+=x%2;
				x/=2;
			}
		}
	}
	for(int i=0;i<ik.size();i++)
	{
		for(int j=0;j<ik.size();j++)
		{
			int u=ik[i].first;
			int v=ik[j].first;
			if(!((u&v)||(u&(v<<1))||(u&(v>>1))))
			ik2[i][j]=1;
		}
	}
	dfs(0,0,0);
	cout<<ans<<endl;
	return 0;
}
2020/12/19 12:31
加载中...