首页 > 其他分享 >Acwing 5729.闯关游戏 状压DP

Acwing 5729.闯关游戏 状压DP

时间:2024-07-08 16:42:40浏览次数:15  
标签:5729 const int 状压 关卡 DP define

Acwing 5729.闯关游戏 状压DP

题目链接

题意

现在进行一个闯关游戏,一共有 \(n\) 个关卡,第 \(i\) 个关卡的分数为 \(w_i\)。另外还有 \(k\) 个联动彩蛋。如果玩家通过第 \(x\) 个关卡后,紧接着通过了第 \(y\) 个关卡,就可以获得额外 \(c\) 分。现在你需要恰好通过 \(m\) 个不同关卡,顺序自由安排。使得总得分最大。

\(1\le m \le n \le 18\).

思路

注意到数据范围,贪心不可行。不妨尝试状压DP。

数组第一维自然就是表示选择的状态,第二维我们要考虑如何进行划分。我们可以考虑以最后一次选择的关卡进行划分。

因此,定义 \(f_{i,j}\) 表示状态为 \(i\) 时且最后一次选择通过 \(j\) 关卡时,所能获得的最大分数。

接着考虑如何转移。结合题意中的联动彩蛋,很自然的想到,我们可以去枚举倒数第二次的关卡选择,这样便可以进行状态转移。

即 \(f_{i,j}=max(f_{i,j},f_{i-(1<<j),k}+g_{k,j}+w_j)\)。

最后我们只需要再枚举一遍,找出状态中恰好选取了 \(m\) 个关卡的状态,更新答案即可。

代码

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 20, M = 105;
const int mod = 1e9 + 7;
const int cases = 0;

LL f[1<<N][N];
int w[N],g[N][N];
void Showball(){
   int n,m,k;
   cin>>n>>m>>k;
   for(int i=0;i<n;i++) cin>>w[i];
   while(k--){
      int x,y,c;
      cin>>x>>y>>c;
      g[x-1][y-1]=c;
   }

   for(int i=0;i<n;i++) f[1<<i][i]=w[i];

   for(int i=0;i<1<<n;i++){
      for(int j=0;j<n;j++){
         if(i>>j&1){
            for(int k=0;k<n;k++){
               if(k!=j&&i>>k&1){
                  f[i][j]=max(f[i][j],f[i-(1<<j)][k]+g[k][j]+w[j]);
               }
            }
         }
      }
   }

   LL ans=0;
   for(int i=0;i<1<<n;i++){
      int cnt=0;
      for(int j=0;j<n;j++){
         if(i>>j&1) cnt++;
      }
      if(cnt==m){
         for(int j=0;j<n;j++){
            ans=max(ans,f[i][j]);
         }
      }
   }
   cout<<ans<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

标签:5729,const,int,状压,关卡,DP,define
From: https://www.cnblogs.com/showball/p/18290271

相关文章

  • 区间DP专栏 第一章(双色马、神医胡青牛、Deque等)
    #A.神医胡青牛题目描述胡青牛是“倚天屠龙记”中的神医(但从此题目看出很贪财),每天都有N多(N<=2000)的人来求他治病,这些人排成一队,从1开始编号直到N,每个人手里都拿着一个牌子,其上的值用Ai(1<=i<=N,1<=ai<=1000)代表,表示自己愿意付给胡大牛多少钱做为酬金。胡神医每次从队......
  • DDP:微软提出动态detection head选择,适配计算资源有限场景 | CVPR 2022
    DPP能够对目标检测proposal进行非统一处理,根据proposal选择不同复杂度的算子,加速整体推理过程。从实验结果来看,效果非常不错来源:晓飞的算法工程笔记公众号论文:ShouldAllProposalsbeTreatedEquallyinObjectDetection?论文地址:https://arxiv.org/abs/2207.03520......
  • ThreadPoolExecutor - 管理线程池的核心类
    下面是使用给定的初始参数创建一个新的ThreadPoolExecutor(构造方法)。publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitun......
  • (轮廓线)插头 DP
    出自陈丹琦的《基于连通性状态压缩的动态规划问题》。论文PDF一般基于棋盘(方格表)模型。【(轮廓线)插头DP】如果有简单点的例题就好了,但没有找到,那么直接拿插头DP模板题吧。插头DP模板题给定一个方格表,有一些格子放了障碍物,求用一条回路恰好经过所有格子的方案数。\(n,m......
  • WPF Behavior InvokeCommandAction Command CommandParameter
    //xaml<behavior:Interaction.Triggers><behavior:EventTriggerEventName="MouseWheel"SourceObject="{BindingElementName=img}"><behavior:InvokeCommandActionCommand="{BindingMouseWheelCmd}"......
  • 时间序列分析:西安GDP 的 ARIMA 分析SAS操作过程(理论知识略)
    目录一、西安GDP的ARIMA分析二、判断序列的平稳性 三、定阶和预测SAS代码附录:一、西安GDP的ARIMA分析通过对某一指标进行短期的ARIMA分析预测,我们能够预见其未来几年的变化趋势.基于这些预测结果,我们可以采取针对性的措施和制定适应性政策,以促进快速且高效的发......
  • DDPM生成人脸代码
    基于DDPM介绍的理论,简单实现DDPM生成人脸,代码如下:utils.pyimportosfromtorch.utils.dataimportDatasetfromtorchvision.transformsimporttransformsimportglobimportcv2classMyDataset(Dataset):def__init__(self,img_path,device):super(My......
  • 最大魅力值-线性dp
    蓝桥云课-最大魅力值#include<iostream>#include<cstring>usingnamespacestd;inta[101];intdp[101][101];intmain(){intn;cin>>n;for(inti=1;i<=n;++i){cin>>a[i];}memset(dp,-10000,sizeof(dp));/......
  • 使用zdppy_api+onlyoffice word文档在线共同编辑,附完整的vue3前端代码和python后端代
    参考文档:https://api.onlyoffice.com/zh/editors/basichttps://api.onlyoffice.com/zh/editors/coedit基本的架构思考:文档表:记录的是文档信息key:这个key可以标识唯一的一个文档,可以是文档的hash值fileType:文档的类型,docx,txt,pdf,其他title:文档的标题,也就是文档的实际......
  • Udp
    Udp协议1.客户端(与服务器不需建立连接)//1.建立socketDatagramSocketdatagramSocket=newDatagramSocket();//2.建立一个包Stringmsg="你好!";InetAddresslocalhost=InetAddress.getByName("127.0.0.1");intpost=9000;//数据,数据起始,数据长度,数据发送地址Datag......