看到B<=8,直接状态压缩即可。

dp[i][j][k]表示当前相对位置是关于i的,并且i以前的已经就餐完毕,j表示i和之后的就餐情况,k表示上一个就餐的人的相对位置。

然后Dp即可

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
 
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define inf 0x3f3f3f3f
#define maxn 1005
const int buf=8;
 
int dp[maxn][258][17];
int T,t[maxn],b[maxn],n;
 
int main()
{
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d",&n);
        F(i,1,n) scanf("%d%d",&t[i],&b[i]);
        memset(dp,0x3f,sizeof dp);
        dp[1][0][-1+buf]=0; 
        F(i,1,n) F(j,0,(1<<8)-1) F(k,-8,7) 
            if (dp[i][j][k+buf]<inf)
            {
                if (j&1)
                    dp[i+1][j>>1][k+buf-1]=min(dp[i+1][j>>1][k+buf-1],dp[i][j][k+buf]);
                else
                {
                    int lim=inf;
                    F(l,0,7) if (!(j&(1<<l)))
                    {
                        if (i+l>lim) break;
                        lim=min(lim,i+l+b[i+l]);
                        dp[i][j|(1<<l)][l+buf]=min(dp[i][j|(1<<l)][l+buf],dp[i][j][k+buf]+(k+i==0?0:t[k+i]^t[l+i]));
                    }
                }
            }
        int ans=0x3f3f3f3f;
        F(i,-8,7) ans=min(ans,dp[n+1][0][i+buf]);
        printf("%d\n",ans);
    }
}

  

相关文章:

  • 2022-02-26
  • 2021-06-03
  • 2022-01-11
  • 2022-12-23
  • 2021-07-07
  • 2021-10-30
  • 2021-06-21
猜你喜欢
  • 2022-02-13
  • 2022-01-30
  • 2021-12-15
  • 2021-05-30
  • 2022-01-15
  • 2021-10-11
  • 2021-10-02
相关资源
相似解决方案