一本通-P1683-稗田阿求
题目链接
用一个数组
if(b[i]&(1<<j-1))
即i和j起冲突了。
我们还可以做一个最优化剪枝,如果当前枚举到的长度 和已经枚举的长度cnt满足,因为假设全取都不可能比当前答案大了,所以返回。退出下列代码
#include<cstdio>
#include<cstring>
#define re register
using namespace std;
const int N=101;
int ans,n,m,a[N][N],x;
long long b[N];
bool bo[N],boo;
char s[N];
inline void DFS(int t,int cnt,long long res)
{
if(cnt+m-t+1<=ans)
return;
if(t>m)
{
//printf("%d\n",cnt);
if(cnt>ans)
ans=cnt;
return;
}
if(((~res)&(1ll<<(t-1)))&&((~b[t])&(1ll<<(t-1))))
DFS(t+1,cnt+1,res|b[t]);
DFS(t+1,cnt,res);
}
int main()
{
scanf("%d%d",&n,&m);
for(re int i=1; i<=m; i++)
{
scanf("%s",s+1);
int len=strlen(s+1);
for(re int j=1ll; j<=len; j++)
{
scanf("%d",&x);
a[i][s[j]]=x;
}
}
for(re int i=1; i<=m; i++)
for(re int j=1; j<=m; j++)
{
memset(bo,false,sizeof(bo));
boo=false;
for(re char k='A'; k<='Z'; k++)
if(a[i][k]&&a[j][k]&&a[i][k]!=a[j][k])
{
boo=true;
break;
}
if(boo)
{
b[i]|=1ll<<(j-1);
continue;
}
for(re char k='A'; k<='Z'; k++)
if(a[i][k]||a[j][k])
{
if(!a[j][k])
x=a[i][k];
else
x=a[j][k];
if(!bo[x])
bo[x]=true;
else
{
boo=true;
break;
}
}
if(boo)
b[i]|=1ll<<(j-1);
}
DFS(1,0,0ll);
printf("%d\n",ans);
/*for(re int i=1; i<=m; i++)
printf("%d ",b[i]);*/
return 0;
}
作者:蒟蒻wjr
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?