洛谷2157
看到
因为搜索出现频率太低,先考虑状压
显然应该将
所以设
注意这里的状态不能设置为先打完饭的人是
1
9
9 4
5 7
9 3
8 1
6 6
3 5
4 5
9 4
3 0
正确答案应该是
首先判断当前状态是否合法
如果存在某一个没打饭的人,后面有一个人已经打了饭且这个人的位置比这个没打饭的人的忍耐度还大,那就不合法(这个过程小模拟即可,不是本文重点,故不再赘述)
在当前状态合法之后,分情况DP
即此时最后一个打饭的人是在
这个方程是什么意思呢?最后一个打饭的人是
那我们就去掉
此时在讨论在新集合状态下,最后一个打饭的人是谁,如果仍然是
如果是在
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1010;
int n;
int t[N],b[N];
int f[N][1<<8][16];
int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-48;s=getchar();}
return x*f;
}
bool valid(int i,int j)
{
int temp=j;
for(int k=0;k<=7&&i+k<=n;k++)
{
if((j>>b[i+k]+1)&&!(temp&(1<<k))) return 0;
j>>=1;
}
return 1;
}
int main()
{
int c=read();
while(c--)
{
n=read();
for(int i=1;i<=n;i++)
t[i]=read(),b[i]=read();
memset(f,0x3f,sizeof(f));
for(int i=0;i<=7;i++)
if(valid(1,1<<i))
f[1][1<<i][i+8]=0;//初始化
for(int i=1;i<=n;i++)
{
for(int j=0;j<(1<<8);j++)
{
if(!valid(i,j)) continue;
for(int k=-8;k<=-1;k++)
{
if(i+k<=0) continue;
if(i+k+b[i+k]<i-1) continue;
if((j>>b[i+k]+k+1)) continue;
if((j<<-k)>=(1<<8)) continue;
f[i][j][k+8]=min(f[i][j][k+8],f[i+k][(j<<-k)|((1<<-k)-1)][8]);
}
for(int k=0;k<=7;k++)
{
if(!(j&(1<<k))) continue;
int o=(j^(1<<k));
for(int l=-8;l<=-1;l++)
{
if(i+l<=0) continue;
if(i+l+b[i+l]<i-1) continue;
if((o>>b[i+l]+l+1)) continue;
if((o<<-l)>=(1<<8)) continue;//这里一堆都是合法性判断,您可以尝试理解
f[i][j][k+8]=min(f[i][j][k+8],f[i+l][(o<<-l)|((1<<-l)-1)][8]+(t[i+k]|t[i+l])-(t[i+k]&t[i+l]));
}
for(int l=0;l<=7;l++)
{
if(!(o&(1<<l))) continue;
f[i][j][k+8]=min(f[i][j][k+8],f[i][o][l+8]+(t[i+k]|t[i+l])-(t[i+k]&t[i+l]));
}
}
}
}
int ans=0x7fffffff;
for(int i=0;i<=min(7,n);i++)
for(int j=0;j<=i;j++)
ans=min(ans,f[n-i][(1<<i+1)-1][j+8]);
printf("%d\n",ans);
}
return 0;
}
后记和感想
这题其实我做了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构