LP2157 [SDOI2009]学校食堂 [状压dp]

Author Avatar
空気浮遊 2018年10月25日
  • 在其它设备中阅读本文章
  • 状压dp
  • 分享到 Facebook
  • 分享到 Telegram
  • 分享到 Twitter
  • 分享到微博

Problem

https://www.luogu.org/problemnew/show/P2157

Solution

一开始是想做二维,即第二维状态压缩。
然后考虑转移,那么再枚举一个最优打饭的顺序。
但这样的话,第一个打饭的人和前一个打饭的人不知道呀?多加一维记录前一个打饭的人么?
太麻烦了吧..

最后确实要多加一维,同时可以把多出来的那一维省去。

我也不知道我在干什么... 被那个 ok 函数的含义卡了好久..

一开始是完全错的,然后后来又改成了半对半错——正确的应该是若 $i$ 没打饭,那么才有 $(i, i+b_i]$ 这个限制,否则是没有的...

我也不知道我干什么搞了一晚上才发现这个错误...

Code

// Code by ajcxsu
// Problem: food

#include<bits/stdc++.h>
#define CLR(x, y) memset(x, y, sizeof(x))
using namespace std;

const int N=1001, T=1<<8, U=T-1;
int c[N], b[N];
int f[N][T][17];

bool ok(int i, int j, int x) {
    int k=0;
    while(x) {
        if(!(j&1) && x>b[i+k]) return false;
        k++, x--, j>>=1;
    }
    return true;
}

int main() {
    ios::sync_with_stdio(false), cin.tie(0);
    int cas;
    cin>>cas;
    while(cas--) {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++) cin>>c[i]>>b[i], b[i]=min(b[i], n-i);
        CLR(f, 0x3f);
        f[1][0][7]=0;
        int ans=0x3f3f3f3f;
        for(int i=1;i<=n;i++)
            for(int j=1;j<T;j++)
                for(int k=0;k<=b[i]+8;k++) {
                    if(k>=8 && (j&(1<<(k-8))) && ok(i, j^(1<<(k-8)), k-8))
                        for(int l=0;l<=b[i]+8;l++)
                            if(i+l-8>=0)
                                f[i][j][k]=min(f[i][j][k], f[i][j^(1<<(k-8))][l]+
                                (i+l-8?(c[i+k-8]^c[i+l-8]):0));
                    if(j&1) {
                        if(k && i!=n) f[i+1][j>>1][k-1]=min(f[i+1][j>>1][k-1], f[i][j][k]);
                        if(i==n) ans=min(ans, f[i][j][k]);
                    }
                }
        printf("%d\n", ans);
    }
    return 0;
}

本文链接:https://pst.iorinn.moe/archives/sol-luogu-2157.html
许可: https://pst.iorinn.moe/license.html
若无特别说明,博客内的文章默认将采用 CC BY 4.0 许可协议 进行许可☆

      新篇
旧篇      
    • fingerprint Login
  • home 主页
  • inbox 归档
    • June 2026 1
    • December 2024 1
    • August 2024 1
    • June 2024 1
    • April 2024 3
    • March 2024 1
    • February 2024 2
    • January 2024 1
    • November 2023 1
    • August 2023 1
    • May 2023 1
    • February 2023 2
    • January 2023 2
    • July 2022 1
    • June 2022 1
    • April 2022 1
    • March 2022 1
    • February 2022 2
    • December 2021 1
    • November 2021 1
    • August 2021 3
    • July 2021 3
    • April 2021 2
    • March 2021 1
    • February 2021 4
    • January 2021 2
    • December 2020 1
    • November 2020 1
    • October 2020 3
    • September 2020 1
    • August 2020 1
    • July 2020 1
    • March 2020 1
    • December 2019 1
    • September 2019 1
    • July 2019 1
    • April 2019 2
    • March 2019 13
    • February 2019 15
    • January 2019 11
    • December 2018 3
    • November 2018 6
    • October 2018 28
    • September 2018 31
    • August 2018 18
    • July 2018 13
    • June 2018 27
    • May 2018 11
    • April 2018 12
    • March 2018 19
    • February 2018 8
    • January 2018 7
    • December 2017 2
    • November 2017 2
  • apps 分类
    • 笔记
    • 题解
    • 杂文
    • 技术
    • 游戏
    • 小说
  • 留言板
  • 关于
  • 友链
  • 文章总数 281
主题 - Material i
expand_less
Copyright © 2026 雪屋
Float in air.
Powered by Typecho
Theme - Material