ZOJ3777 - Problem Arrangement(状压DP)

UE5新手必看:3种UI定位方法实战(含蓝图配置截图) 本文为UE5新手详细解析了三种核心UI定位方法:屏幕空间、场景空间和世界空间。通过实战蓝图配置与控件操作,指导开发者如何根据HUD、角色血条、3D物体标记等不同应用场景,正确选择并配置UI的定位方式,以实现清晰的信息传递与沉浸式体验。 阅读详情

题目链接:

https://cn.vjudge.net/problem/ZOJ-3777


题目大意:

现在有一个N×N的矩阵,现在要求在这个矩阵里面取N个来自不同行不同列的数,使这个数大于给定的M。求总共有多少种取法。
(N < 12, M < 500)


解题过程:

组队赛时候的题,当初是暴力DFS的,当作简化的八皇后问题,结果当然是超时。

最近开始补题,正好在刷DP的题,于是顺手切了,算是一个状压DP的模板题。


题目分析:

首先看这个数据量,N和M的范围都非常小,显然可以拿来DP。一个题可以状态压缩,通常有几个量比较小,用来把状态压缩成二进制的数直接储存。

以DP的思路来讲,这题的状态应该是二维的,一个维度是存的状态压缩后的集合,另一个是储存的当前累加的和,DP数组是存的当前解的个数。

首先对于集合S,储存那些行已经有一个数被取了,这样可以保证一个无后效性,并且产生了许多重复子问题。如果前面已经取的点是集合S,并且前面的累加和是M。那么对于后面的数怎么取,有几个解,只需要计算一次即可。下一次如果一个状态仍是取的点的集合是S,并且累加和是M的话,那么直接用上一次计算的结果就可以了。

这样总共的复杂度是O(2^N*M),即状态总数。


记忆化搜索:

#include<bits/stdc++.h>
using namespace std;

#define LL long long

int dp[(1<<13)][600];
int n, m;
int data[112][112];

//计算阶乘
int fun(int n) {
    LL rst = 1;
    for (int i = 1; i <= n; i++) {
        rst *= i;
    }
    return rst;
}

int dfs(int dep, int num, int pre) {

    //递归边界
    if (dep >= n) {
        return num >= m;
    }

    int& ans = dp[pre][num];

    if (ans != -1)
        return dp[pre][num];

    ans = 0;

    //剪枝,如果当前已满足了,那么只需要计算下剩下的组合个数
    if (num >= m)
        return ans = fun(n-dep);

    for (int i = 0; i < n; i++) {
        if (pre&(1<<i))
            continue;
        int temp = pre|(1<<i);
        ans += dfs(dep+1, num+data[dep][i], temp);
    }
    return ans;
}



int main() {

    int T;
    scanf("%d", &T);
    while (T--) {
        memset(dp, -1, sizeof(dp));
        scanf("%d %d", &n, &m);

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                scanf("%d", &data[i][j]);
            }
        }

        int aa = fun(n);
        int bb = dfs(0, 0, 0);

        if (bb != 0) {
            int cc = __gcd(aa, bb);
            aa /= cc;
            bb /= cc;
            printf("%d/%d\n", aa, bb);
        }
        else {
            printf("No solution\n");
        }
    }
}

递推:

#include<bits/stdc++.h>
using namespace std;

int dp[1<<13][666];
int data[112][112];

int fun(int n) {
    int rst = 1;
    for (int i = 2; i <= n; i++)
        rst *= i;
    return rst;
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        int n, m;
        scanf("%d %d", &n, &m);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                scanf("%d", &data[i][j]);
            }
        }
        memset(dp, 0, sizeof(dp));

        //代表对于前0行,使和为0的取法有1种
        dp[0][0] = 1;


        //遍历每一种取法
        for (int i = 0; i < (1<<n); i++) {
            int cnt = 0;

            //计算取到了第几行
            for (int j = 0; j < n; j++) {
                if (i&(1<<j))
                    cnt++;
            }

            //尝试取下一个数
            for (int j = 0; j < n; j++) {
                if (i&(1<<j))
                    continue;

                //遍历取到的和,如果和大于M,那么加到M那里
                for (int k = 0; k <= m; k++) {

                    //这里的思想类似背包
                    if (k+data[cnt][j] >= m)
                        dp[i+(1<<j)][m] += dp[i][k];
                    else
                        dp[i+(1<<j)][k+data[cnt][j]] += dp[i][k];
                }
            }
        }
        int ans = dp[(1<<n)-1][m];
        if (ans == 0)
            printf("No solution\n");
        else {
            int aa = fun(n);
            int bb = __gcd(aa, ans);
            printf("%d/%d\n", aa/bb, ans/bb);
        }
    }
}
ZooKeeper 实战:使用 Docker Compose 部署 ZooKeeper 集群 ZooKeeper是一个开源的分布式协调服务,用于管理大型分布式系统中的数据。它由Apache软件基金会提供,最初是Hadoop的一个子项目,但后来发展成为一个独立的顶级项目。ZooKeeper提供的一致性协调服务对于构建分布式应用和服务非常重要,特别是在需要精确的领导选举、配置管理、命名服务、分布式同步和提供分布式锁等功能时。 阅读详情

相关推荐

Vivado SDK中LWIP库版本冲突与RTL8211FDI兼容性实战解析

本文深入解析Vivado 2019.1 SDK中LWIP 1.0库与RTL8211FDI千兆PHY芯片的版本冲突问题,并提供实战解决方案。通过手动移植高版本LWIP库、整合第三方驱动及优化BSP配置,有效解决了以太网通信兼容性问题,确保千兆性能稳定运行。

ios99的博客 273

ZOJ 3777 11th省赛 B Problem Arrangement【状态压缩DP】

题目链接http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5264思路题意就是n个题目,第i个题目放到第j个位置的有趣值是p[i][j],问你随机排列使得有趣值总和大于等于m的期望值是多少。 这个期望值很好算就是n!/cnt。直接dfs会超时,这里用到了DP,而DP的话,如果设dp[i][j]表示放了前i个题目,有趣值总和为j的方

初涉_代码世界 725

【Tessent Shell Users Manual】【Ch3】Design Introspection and Editing(未完待续)

Tessent Shell 提供了一系列用于检查(examining/introspecting)和编辑design的命令。

Tranquil_ovo的博客 1731

Problem Arrangement

简单DP,用来求全排列的某个性质 题目的一个限制为和,所以DP增加一维

Confidence的专栏 1867

GD32的低功耗模式:睡眠、深度睡眠与待机模式

GD32F4xx提供三种主要低功耗模式,功耗逐级降低:睡眠模式 (Sleep Mode)关闭CPU时钟,保持外设运行任意中断/事件唤醒深度睡眠模式 (DeepSleep Mode)关闭CPU和大部分外设时钟需特定唤醒源(外部中断、RTC等)待机模式 (Standby Mode)最低功耗,仅备份域维持供电仅支持复位、RTC、WKUP引脚唤醒。

波风水门的博客 2277

用deepseek部署全自动的机器人--bytebot

Bytebot是一款开源AI桌面代理,提供完整的虚拟桌面环境,支持跨应用任务处理、文件管理、文档处理等复杂工作流。其技术架构包含核心控制、LLM代理、UI等组件,支持Docker和Kubernetes部署。本文演示了基于CloudStudio的部署流程,包括环境配置、Docker部署及DeepSeek API集成,实现多模型调用功能。

Kin 2481

ZOJ 3300 Mahjong(DFS)

枚举1-9搜索就可以了. #include #include #include using namespace std; int tiles[10]; bool dfs(int curi,int melds,int eye){ if(melds==4&&eye==1)return true; if (curi>=10||eye>1||melds>4)return false; int

蚂蚁大战大象 568

Stata森林图进阶:个性化定制与高级技巧

本文详细介绍了Stata森林图的进阶技巧,包括个性化定制与高级应用。通过meta分析工具如metan命令,用户可以优化字体、颜色、坐标轴等视觉元素,提升森林图的专业性和可读性。文章还提供了黑白印刷设置、高分辨率导出等实用技巧,帮助科研人员制作符合学术出版要求的森林图。

ios99的博客 254

ZOJ - 3777 Problem Arrangement 【状压dp】

Problem Arrangement Time Limit: 2 Seconds      Memory Limit: 65536 KB The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange the o

Puya的博客 620

日志异常检测详细整理,看这一篇就够了(附各项目代码链接)

对于不用的日志键,用它们的参数值向量训练一个参数值异常检测模型来检测有这些参数值反映的系统性能异常。与标准的GAN框架一样,D和G的参数是基于D的输出来更新的,因此鉴别器D可以被训练为尽可能敏感地将正确的标签分配给真实和虚假序列,而生成器将被训练为尽可能聪明地在经过足够多轮的迭代后欺骗鉴别器,即误导D将真实标签分配给虚假序列。LR:逻辑回归是有监督的模型,将处理后的特征矩阵以及标记作为模型的输入,得到训练后的模型,用此模型预测新出现的特征向量,以此判断特征向量是否为异常的,进而判断日志异常。

qq_20368489的博客 1万+

红米k60 修复“NV损坏” 去除主板校验电阻步骤解析与图示

红米k60 基带代码:mondrian。搭载‌高通骁龙8+ Gen1处理器.国外版本称:POCO F5 Pro适用于以下型号的小米机型:23013RK75C, 23013PC75G。 💝💝💝通过博文了解 1💝💝💝-----此机型修复NV损坏硬件类操作主板图示 2💝💝💝-----了解设备出现NV损坏的底层逻辑 3💝💝💝 ------具体修改步骤

小马哥的专栏 395

zoj 3777 Problem Arrangement 【状压dp】

Problem Arrangement Time Limit: 2 Seconds      Memory Limit: 65536 KB The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange the

世界很大 458

AIGC 算法工程师面试八股文全解析:Diffusion Models 原理、推导与实战要点

特性 | 重参数化技巧 (Reparameterization Trick) |本质| 将随机变量的采样过程从不可导的随机操作转换为可导的确定性函数与一个已知分布的随机噪声的组合。目的。

m0_71589036的博客 404

ZOJ 3777 Problem Arrangement 状压dp

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5264 题意: 给定一个n*n的矩阵,在矩阵中选n个数字(每行每列只能选一个数字),问选出的数字和>=m的方法数 思路: 1、矩阵较小可以状压 2、每次转移以 数字和为记录,因为mm,可以视为m 相当于一个全排列中找方法数 即把n个数填入n个空格内

九野的博客 2915

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

zoj 3777 Problem Arrangement(状压dp)

题目链接The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange the order of the problems. As we know, the arrangement will have a great effec

ciel_s的博客 504

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ZOJ - 3777 Problem Arrangement(状压dp)

题目链接 题意:a[i][j]表示第i个数字放在第j位能得到的值,求所有排列顺序值的总和大于等于m的期望。 题记:n个数的排列顺序一共有n!个。直接枚举出所有排列顺序的话最大有12!个(479001600),所以必定是会超时的。所以要用状压dp取解决。 首先排列的数字一定是n个,那么我们用一个长度为n的二进制数去表示状态。1表示数字已经填了,0表示还没填。 例如:0000011表示第六第七个数字已经填了,其余的还没填。 dp[i][j]表示在i的这个状态值为j。j的值最大取到m。 #include<i

moyangxian 189

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ZOJ 3777 Problem Arrangement-状压dp

http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3777 输入n,m; 给一个n*n的矩阵,mp[i][j]表示第i题选题目j会有 相应的得分 让你选择一个序列,求序列得分超过m的个数 n《12,m 可以把12种状态压位到一个int dp[i][j] 中的i有cnt个1,表示选了前cnt题,那么接下来

缺氧 620

ZOJ 3777 Problem Arrangement (状压DP)

分析:题目要求数学期望,其实就是求最终值≥M\ge{M}的概率。暴力的做法:找出所有排列方式,一个一个找:o(12!)o(12!),贵了。对数据敏感的话,应该比较容易想到状压。 dp[i][msk][j]dp[i][msk][j]代表前ii个数用了mskmsk状态的数,和为jj的排列总数。 那么转移方程: dp[i][msk][j]=∑msk第k位为1dp[i−1][msk|1<<k][j−p

无限大な梦のあとの 何もない世の中じゃ 553

ZOJ 3777 Problem Arrangement ( 状压dp )

题目链接 大致题意: 输入 nnn 和 mmm,接下来一个 n∗nn*nn∗n 的矩阵,mp[i][j]mp[i][j]mp[i][j] 表示第 iii 道题放在第 jjj 个顺序做可以加 mp[i][j]mp[i][j]mp[i][j] 的分数,问做完 nnn 道题所得分数大于等于 mmm 的概率。用分数表示,分母为上述满足题意的方案数,分子是总的方案数,输出最简形式。 解题报告: 状压 dpdpdp,枚举所有 题目被选举的状态。 dp[i][j]dp[i][j]dp[i][j] 表示 iii 状态下得

qhq889的博客 180

ZOJ - 3777 Problem Arrangement(状压dp)

题目链接:点击查看 题目大意:给出n道题,以及不同题目不同时间的兴趣值,p[i][j]代表的是第j道题放在第i个位置做的时候可以得到的兴趣值,问有多少种排列组合的方式能让最后做完所有题目的兴趣值大于等于m 题目分析:因为涉及到先后顺序问题,所以用状态压缩更容易实现枚举和状态转移,所以这个题要用状态压缩来解决。dp[i][j]代表的是状态为i时兴趣值为j的方案数,那么我们最后只需要判断一下dp[...

Falcon的博客 399

ZOJ - 3777 Problem Arrangement (状压dp)

The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange the order of the problems. As we know, the arrangement will have a great effect o...

dsaghjkye的博客 220

【ZOJ】3777Problem Arrangement(状压DP题解)

Time Limit: 2 Seconds      Memory Limit: 65536 KB The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange the order of the problems. As ...

红点雷龙XL 342

【状压DP】 ZOJ 3777 Problem Arrangement

点击打开链接 题意:N道题目,排序,每道题在不同的位置得到的值不同。 求随机排序后得到值大于等于m的期望次数。 因为是随机排序,所以概率就是  总数/可行数 #include #include #include #include #include using namespace std; #define ll long long int n,m,t; int a[

Kewowlo 788

zoj 3777 Problem Arrangement (好状压dp)

Problem Arrangement Time Limit: 2 Seconds      Memory Limit: 65536 KB The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange th

To be what you what to be! 1670

ZOJ 3777 Problem Arrangement(状压DP)

题目链接 :http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5264 //今年省赛的题目,比赛的时候知道是状压却一直没搞出,直到最后。虽然赛后知道做法,也一直没做的,最近想不开就来做了 - -, 顺便用了下快速枚举k-子集。 恩, 做法么就是开dp[i][j] i已经选过了的题目的一个集合,j表示的是获得了j分,然后就可以...

weixin_30823227的博客 90

ZOJ 3777 - Problem Arrangement(状压DP)

题目: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5264 题意: 给出n*n的矩阵,从中选出n个数,任意两个数在不同行不同列,求出总和大于m的方案数。 思路: 因为给出的矩阵比较小(n dp[i][s][k] 表示到第i行状态为s总和为j 的方案数。 总和j>m时当做m。 因为转移的时候i只与前一行有关,

Halo 771
上一篇: 第八届acm山东省赛总结
下一篇: POJ1182 - 食物链(带权并查集)
ACM_Fish
博客等级 码龄10年 69粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值