20170606组队赛比赛总结

本文介绍了一种使用动态规划(Dp)解决循环依赖问题的方法。通过构建拓扑序或树形结构,利用Dp记录每层循环次数的状态,并采用前缀和优化来提高效率。

B

思路

  • 我们发现对于每个数只有 1<<10 种状态,直接Dp 即可
  • 没有想该题(甩锅)

C

思路

  • 同时由于题意,我们发现每个循环的上下界只会有一个被其他循环限制
  • 很容易发现每个循环可以形成一个拓扑序(或者树形的结构)
  • 那么,我们可以用Dp对状态进行量化,我们用Dp记录第i层(循环)次数(循环的次数)为j时的状态
  • 为了提高效率,我们可以用前缀和优化即用Dp[i][j]记录第i层次数小于等于j的答案
  • 转移的方程就很简单了
void dfs(int x){
    for(int i=l[x];i<=r[x];i++)dp[x][i]=1;
    for(int i=0;i<G[x].size();i++){
        int y=G[x][i];
        dfs(y);
        for(int j=l[x];j<=r[x];j++){
            int L=l[y],R=r[y];
            if(cmd[y]==1)L=j;
            if(cmd[y]==2)R=j;
            if(L<=R)Pro(dp[x][i],dp[y][R]-dp[y][L-1]+P);
            else dp[x][j]=0;
        }
    }
    for(int i=l[x];i<=r[x];i++)Add(dp[x][i],dp[x][i-1]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值